我正在学习装饰器,我有一个问题。在这个装饰器函数git filter-branch --tree-filter \
'test -d project/app && mv project/app . || echo "Nothing to do"' HEAD
中,定义并返回另一个函数,并将"替换"函数call_counter
作为参数传递给装饰器函数。
func
完成此操作后,我们可以通过以下方式从任何功能外部访问def call_counter(func):
def helper(*args, **kwargs):
helper.calls += 1
return func(*args, **kwargs)
helper.calls = 0
return helper
:
helper.calls
输出:
@call_counter
def addition(x, y):
return x + y
print(addition.calls)
addition(1, 2)
print(addition.calls)
我的问题是,在0
1
函数被调用并退出后,helper.calls
变量如何存在于内存中?据我了解,call_counter
存在于helper.calls
的记忆中。但是,如果在call_counter
执行完成后可以访问变量,这似乎不太可能。
答案 0 :(得分:1)
calls
是helper
的一个属性,它会一直存在直到helper
死亡,而helper
不会死亡,因为正如你所说,它将会生存下去addition
名称。
答案 1 :(得分:0)
call_counter
函数每次使用名称helper
调用时都会创建一个新对象(函数)。 call_counter
函数返回新创建的对象。而且当装饰器工作时它基本上是这样的:
def addition(x,y):
return x+y
addition = call_counter(addition)
所以现在返回的对象(以前称为helper
的函数)存储在addition
下。