为什么以及如何在python装饰器中调用__call__

nav*_*yad 4 python-2.7

class myDecorator(object):

    def __init__(self, f):
        print "inside myDecorator.__init__()"
        f() # Prove that function definition has completed

    def __call__(self):
        print "inside myDecorator.__call__()"

@myDecorator
def aFunction():
    print "inside aFunction()"

def main():
    print "main starts....."
    aFunction()
    print "main ends....."
Run Code Online (Sandbox Code Playgroud)

输出:

inside myDecorator.__init__()
inside aFunction()
main starts.....
inside myDecorator.__call__()
main ends.....
Run Code Online (Sandbox Code Playgroud)

关于上述代码,我无法理解以下几点:

  1. 为什么"主要开始...."不是第一行打印?

  2. 假设我从aFunction()返回一些值,那么它将无法代替其调用,因为aFunction()它被替换为inside myDecorator.__call__()not inside aFunction().

Jos*_*Lee 6

装饰器语法:

@myDecorator
def aFunction():
    …
Run Code Online (Sandbox Code Playgroud)

相当于:

def aFunction():
    …
aFunction = myDecorator(aFunction)
Run Code Online (Sandbox Code Playgroud)

如果myDecorator是一个类,那么__init__在定义函数时你会期望被调用.然后使用该类的实例代替该函数.当你调用它时,你会期望__call__被调用,所以这就是f()应该去的地方.