我觉得你不懂装潢师。让我们举个简单的例子。
def my_decorator(some_function):
def new_function(*args, **kwargs):
'announces the result of some_function, returns None'
result = some_function(*args, **kwargs)
print('{} produced {}'.format(some_function.__name__, result))
return new_function # NO FUNCTION CALL HERE!
@my_decorator
def my_function(a, b):
return a + b
my_function(1, 2) # will print "my_function produced 3"
我们有一个简单的函数
my_function
它返回它的两个参数和一个decorator的总和,decorator将只打印出它所修饰的任何函数的结果。
请注意
@my_decorator
def my_function(a, b):
return a + b
相当于
def my_function(a, b):
return a + b
my_function = my_decorator(my_function)
自从
my_decorator
接受函数作为参数(这里我们给出
我的函数
)并返回
新功能
new_function
(不打电话!),我们有效地覆盖
我的函数
因为我们把名字重新分配给
我的装饰师
返回。
行动中:
>>> my_function(1, 2)
my_function produced 3
请注意,在调用函数的示例中的每一点上,都会出现括号语法。下面是我发布的第一段代码中发生的所有函数调用,顺序如下:
-
my_decorator(my_function)
调用并将返回值重新分配给名称
我的函数
. 这要么发生在
@
语法或更明确地在等效代码段中。
-
my_function(1, 2)
被称为。在这一点上,
我的函数
是
新函数
是装修工送回来的。大脑将其解析为
new_function(1, 2)
.
-
体内
新函数
,我们提出的论点
我的装饰师
被称为(
result = some_function(*args, **kwargs)
)这正好是
我的函数
在步骤1中发生的重新分配之前
。
-
print
被称为。
如果你想了解
新函数
坚持住了
some_function
尽管
我的装饰师
已经从电话里回来了,我建议你调查一下
自由变量
和
关闭
。