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()