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

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

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

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

4

2 回答 2

6

装饰器语法:

@myDecorator
def aFunction():
    …

相当于:

def aFunction():
    …
aFunction = myDecorator(aFunction)

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

于 2013-06-03T13:51:13.077 回答
2

Python中的函数定义

def foo():
    pass

实际上是一种程序员友好的方式来表达类似(伪代码)*:

foo = function(code=compile('pass', ...), globals=globals(), name='foo')

所以包装器只是介于两者之间:

foo = my_wrapper(function(...))

如果包装器是一个类,__init__将被调用。如果它是一个函数,它将被调用。在此声明之后,一切都照常进行。


*此伪代码与真实代码相差不远:

>>> def bar(): pass
...
>>> body = compile('print("hello")', '', 'exec')
>>> function = type(bar)
>>> foo = function(body, globals(), 'foo')
>>> foo()
hello
于 2013-06-03T13:51:39.190 回答