'@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。也就是说 @A def f(): 是非法的。 只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。
一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。
请看以下实例:
Listing 2. Decorator whose function ignores passed-in function
Listing 3. Decorator that modifies behavior of undecorated func
请看以下实例:
>>> def spamrun(fn):
... def sayspam(*args):
... print "spam, spam, spam"
... return sayspam
...
>>> @spamrun
... def useful(a, b):
... print a**2 + b**2
...
>>> useful(3,4)
spam, spam, spam
请参考python主页中的文档:http://www.python.org/dev/peps/pep-0318/,相信会对修饰符有一个更深入的认识。
更多例子:
Listing 1. Bad decorator that does not even return function
|
A decorator might return a function, but one that is not meaningfully associated with the undecorated function:
Listing 2. Decorator whose function ignores passed-in function
|
Finally, a better behaved decorator will in some way enhance or modify the action of the undecorated function:
Listing 3. Decorator that modifies behavior of undecorated func
>>> def addspam(fn):
... def new(*args):
... print "spam, spam, spam"
... return fn(*args)
... return new
...
>>> @addspam
... def useful(a, b):
... print a**2 + b**2
...
>>> useful(3,4)
spam, spam, spam
25