python装饰程序是否立即调用返回的回调?
我试图通过做一些实验来了解装饰者的行为。我找不到任何关于我所看到的东西的医生,所以可能有人能给我指一些东西 下面是使用装饰器的代码:python装饰程序是否立即调用返回的回调?,python,callback,decorator,python-decorators,Python,Callback,Decorator,Python Decorators,我试图通过做一些实验来了解装饰者的行为。我找不到任何关于我所看到的东西的医生,所以可能有人能给我指一些东西 下面是使用装饰器的代码: def register(): def func_wrapper(func): print 'registered' return func_wrapper @register() def main_page_func(): pass def register(func): def func_wrapper():
def register():
def func_wrapper(func):
print 'registered'
return func_wrapper
@register()
def main_page_func():
pass
def register(func):
def func_wrapper():
print 'registered'
return func_wrapper
def main_page_func():
pass
main_page_func = register(main_page_func)
当您运行此代码时,将打印出“已注册”一词:
registered
这大概是没有修饰符的等价(?)代码:
def register():
def func_wrapper(func):
print 'registered'
return func_wrapper
@register()
def main_page_func():
pass
def register(func):
def func_wrapper():
print 'registered'
return func_wrapper
def main_page_func():
pass
main_page_func = register(main_page_func)
当您运行上述命令时,不会打印任何内容。我理解这种情况:func_包装回调被返回
然而,我仍然在为第一个使用decorator的案例而挣扎:既然从未调用main_page_func,为什么要调用print语句
谢谢。删除装饰器后面的括号,它将按照您的预期工作 此外,寄存器函数应采用参数func,但不一定采用内部函数。当您说
@register()
它实际上调用函数register()
,并在那里使用返回值,返回值将是func\u wrapper
,它接受函数对象作为输入。所以,你所做的是
@func_wrapper
def main_page_func():
pass
当你这样装饰它的时候
main_page_func = func_wrapper(main_page_func)
调用func_包装器
,这就是打印已注册
的原因
要解决这个问题,您需要将函数对象传递给寄存器
本身,如第二个示例所示
def register(func): # func should be here
def func_wrapper(): # not here
print 'registered'
return func_wrapper
@register # no parens after `register`
def main_page_func():
pass
现在,评估是这样的
main_page_func = register(main_page_func)
由于尚未执行func_包装
,您将不会看到registed
打印。将@register()
更改为@register
和def register():
(在第一个示例中)更改为类似def register(f):
和func_包装(func)
(在第一个示例中)到func\u wrapper()