def call_counter(func):
print('Called\n')
def helper(x):
helper.calls+=1
return func(x)
helper.calls=0
return helper
@call_counter
def succ(x):
return x+1
print(str(succ.calls)+'\n')
for i in range(10):
print(succ.calls)
succ(i)
print('\n')
print(succ.calls)
答案 0 :(得分:0)
您评论了
我不明白为什么装饰器仅在函数上调用一次。应该叫十次吧?循环中的每次迭代都需要打印一次,因此“ Called”应被打印10次。我想念什么?
我认为您对于包装函数的运行(在代码中命名为helper
)感到困惑。当装饰器传递原始函数并返回包装函数时,装饰器仅被调用一次,该函数以succ
的形式存储在模块中。包装程序被循环调用十次。
运行代码时,这是我得到的输出:
Called
0
0
1
2
3
4
5
6
7
8
9
10
只有前两行(“ Called”及其后的空行)来自装饰器调用。如果仅运行函数定义而不运行循环,则可以看到此信息。即使您从未调用过该函数,也将立即看到“已调用”的字样。
顶部的零和底部的十是来自您在顶层的print
语句中的。紧靠在一起打印的数字是循环的输出,该循环将在每次对包装函数进行新调用之前打印以前的调用计数。