【发布时间】:2016-12-22 08:28:23
【问题描述】:
我在一个函数上有两个装饰器。 每个装饰器都为函数添加一个属性,但第一个装饰器的属性在启动后并没有传递给函数。
为什么f3.calls在下面的代码中仍然为0?
def memorize(fn):
result_list3 = {}
@wraps(fn)
def wrapper(n):
wrapper.calls2 += 1
print("memorize calls2", wrapper.calls2)
found = result_list3.get(n)
if found is not None:
result = found
else:
result = fn(n)
result_list3.update({n: result})
# print(result_list3)
return result
wrapper.calls2 = 0
return wrapper
def countt(fn):
@wraps(fn)
def wrapper(n):
wrapper.calls += 1
print("countt calls", wrapper.calls)
result = fn(n)
return result
wrapper.calls = 0
return wrapper
@memorize
@countt
def f3(n):
if n < 3:
return n
else:
result = f3(n - 1) + 2 * f3(n - 2) + 3 * f3(n - 3)
return result
if __name__ == '__main__':
print(f3(10))
print(f3.calls) # 0
print(f3.calls2) # 25
这是日志:
memorize calls2 1
countt calls 1
memorize calls2 2
countt calls 2
memorize calls2 3
countt calls 3
memorize calls2 4
countt calls 4
memorize calls2 5
countt calls 5
memorize calls2 6
countt calls 6
memorize calls2 7
countt calls 7
memorize calls2 8
countt calls 8
memorize calls2 9
countt calls 9
memorize calls2 10
countt calls 10
memorize calls2 11
countt calls 11
memorize calls2 12
memorize calls2 13
memorize calls2 14
memorize calls2 15
memorize calls2 16
memorize calls2 17
memorize calls2 18
memorize calls2 19
memorize calls2 20
memorize calls2 21
memorize calls2 22
memorize calls2 23
memorize calls2 24
memorize calls2 25
1892
0
25
【问题讨论】:
标签: python decorator python-decorators