python - 即使被装饰的函数被调用多次,装饰器也会运行一次吗?

标签 python decorator python-decorators

所以这段代码应该计算一个函数被调用的次数,但我试图通过运行下面的代码来更深入地理解 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总是等于 0counter(foo)将重置wrapper.counter值为 0 .

最佳答案

装饰器仅在定义被装饰函数时运行,以便修改函数定义。装饰器(包装器)返回的函数是每次调用装饰函数时执行的函数。

关于python - 即使被装饰的函数被调用多次,装饰器也会运行一次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68158933/

相关文章:

python - 编写一个装饰器,为一个类的所有方法应用另一个带有参数的装饰器

python - 基于类字段的生成函数?

python - django装饰器中访问请求用户和url参数

Python - 即使在使用 'remove_job' 后,Apscheduler 也不会停止作业

python - 线性回归给出错误结果

Python Fabric 装饰器

python - 检测 super() 是否有带有装饰器的函数?

python - 'function'对象在django中没有属性 'get'

python - 将 numpy.matrix 转换为 C 双指针的正确方法

python - Matplotlib:如何将直方图转换为离散概率质量函数?