我们假设我们有一个装饰者:
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)
答案 0 :(得分:7)
您的上一个代码段几乎是装饰器的定义。唯一的区别是,在第一种情况下,在函数定义之前评估名称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)
与
不同{{1}}
答案 1 :(得分:4)
没有区别。 @decorator
语法只是让您更容易理解正在应用装饰器。 (这是syntactic sugar的示例。)
答案 2 :(得分:1)
如果存在差异,那么Python 2.4之前的python版本是否不支持@decorator语法,而自石器时代起支持显式装饰器调用。此外,必须在函数定义中应用@decorator语法,并且必须使用相同的函数名称,而稍后可以应用显式装饰器调用,并且可以重命名装饰函数。
使用@decorator语法,除非你有真的,真的,真的好理由不这样做;这几乎从来没有。