用于获取函数调用次数的修饰符-它是如何工作的



我必须计算函数被调用的次数。因此,我编写了一个名为counter的装饰器,它接受函数并将calls属性增加1。这是代码:

def counter(method):
def wrapped(*args, **kwargs):
wrapped.calls += 1
return method(*args, **kwargs)
wrapped.calls = 0
return wrapped

示例:

@counter
def multiply(a, b):
return a * b
multiply(5, 3)
multiply(5, 3)
n_calls = multiply.calls
print(n_calls)

它将输出为2。完美的

我无法理解的是:它是如何工作的?由于calls不是全局变量(因为它只能在decorator内部访问(,我如何通过编写multiply.calls来获得函数调用的数量?

调用次数存储为函数属性,请参阅:multiply.__dict__。装饰器将其初始化为零。对multiply的调用被对wrapped的调用所取代,您可以通过查看multiply.__name__来看到这一点。Wrapped递增calls并返回method(*args, **kwargs),其中methodmultiply

就我对decorator的理解而言,当您定义包装函数时,您将创建wrapped.calls属性。

当你定义乘法函数时,它认为计数器函数是";方法";参数,并返回包含属性调用的包装函数的实例。

所以您的multiply函数实际上是包装函数的一个实例,所以它包含了call属性。

最新更新