假设我们有一个装饰器:
def decor(function):
def result():
printf('decorated')
return function()
return result
以下代码有何区别?
@decor
def my_foo():
print('my_foo')
并且:
def my_foo():
print('my_foo')
my_foo = decor(my_foo)
你的最后一段代码几乎是装饰器的定义。唯一的区别在于,在第一种情况下,名称 decor
在函数定义之前被计算,而在第二种情况下,在函数定义之后被计算。只有当执行函数定义更改名称所指向的内容时,才会产生差异。
无意义的示例:
def decor(function):
def result():
printf('decorated')
return function()
return result
def plonk():
global decor
decor = lambda x: x
return None
@decor
def my_foo(foo=plonk()):
print('my_foo')
不同于
def my_foo(foo=plonk()):
print('my_foo')
my_foo = decor(my_foo)
如果有区别,那就是 Python 2.4 以前的版本不支持 @decorator 语法,而显式调用装饰器则已经支持自石器时代以来。此外,@decorator 语法必须应用于函数定义,并且必须使用相同的函数名称,而显式调用装饰器可以稍后应用,并且可以重命名被装饰的函数。
除非您有非常、非常、非常好的理由不这样做,否则请使用@decorator 语法;这几乎从来没有。