所以这段代码应该计算一个函数被调用的次数,但我试图通过运行下面的代码来更深入地理解 python 中的装饰,而不仅仅是复制代码
def counter(func):
print('counter function executed')
def wrapper(*args, **kwargs):
print('wrapper function executed')
wrapper.count += 1
return func(*args, **kwargs)
wrapper.count = 0
return wrapper
@counter
def foo(i):
return print(f'{i}')
foo('foo')
foo('foo')
foo('foo')
print(foo.count)
它输出
counter function executed
wrapper function executed
foo
wrapper function executed
foo
wrapper function executed
foo
3
但是装饰foo()
应等于 counter(foo)
为什么"counter function executed"
打印过一次??不是应该每次都打印foo()
叫做,是不是意味着装饰foo()
实际上等于 wrapper(foo)
....我说得对吗???
我得出这个结论是因为我认为 wrapper.counter
总是等于 0
如counter(foo)
将重置wrapper.counter
值为 0
.
最佳答案
装饰器仅在定义被装饰函数时运行,以便修改函数定义。装饰器(包装器
)返回的函数是每次调用装饰函数时执行的函数。
关于python - 即使被装饰的函数被调用多次,装饰器也会运行一次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68158933/