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....."

输出:
inside myDecorator.__init__()
inside aFunction()
main starts.....
inside myDecorator.__call__()
main ends.....

我无法理解上述代码的以下几点:
  • 为什么“主要开始......”不是要打印的第一行?
  • 假设如果我从 aFunction() 返回一些值,那么它将无法代替它的调用,因为 aFunction() 被替换为 inside myDecorator.__call__() 而不是 inside aFunction()
  • 最佳答案

    装饰器语法:

    @myDecorator
    def aFunction():
        …
    

    相当于:
    def aFunction():
        …
    aFunction = myDecorator(aFunction)
    

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

    10-08 08:43