我们假设我们有一个装饰者:
def decor(function):
def result():
printf('decorated')
return function()
return result
Run Code Online (Sandbox Code Playgroud)
以下代码有什么区别:
@decor
def my_foo():
print('my_foo')
Run Code Online (Sandbox Code Playgroud)
和:
def my_foo():
print('my_foo')
my_foo = decor(my_foo)
Run Code Online (Sandbox Code Playgroud)
您的上一个代码段几乎是装饰器的定义.唯一的区别是在第一种情况下,在decor函数定义之前评估名称,而在第二种情况下,在函数定义之后评估名称.这只会在执行函数定义更改名称引用的内容时产生影响.
荒谬的例子:
def decor(function):
def result():
printf('decorated')
return function()
return result
def plonk():
global decor
decor = lambda x: x
return None
Run Code Online (Sandbox Code Playgroud)
现在
@decor
def my_foo(foo=plonk()):
print('my_foo')
Run Code Online (Sandbox Code Playgroud)
不同于
def my_foo(foo=plonk()):
print('my_foo')
my_foo = decor(my_foo)
Run Code Online (Sandbox Code Playgroud)