我正在刷新我对一些我还没有得到的Python功能的记忆,我正在从中学习这个Python教程 http://www.python-course.eu/python3_decorators.php还有一个我不完全理解的例子。这是关于装饰器计算对函数的调用的次数,代码如下:
def call_counter(func):
def helper(x):
helper.calls += 1
return func(x)
helper.calls = 0
return helper
@call_counter
def succ(x):
return x + 1
if __name__ == '__main__':
print(succ.calls)
for i in range(10):
print(succ(i))
print(succ.calls)
我在这里不明白的是为什么我们要增加函数包装器的调用(helper.calls += 1)而不是函数调用本身,以及为什么它实际上起作用?
关于装饰器要记住的重要一点是,装饰器是一个function它接受一个函数作为参数,并返回另一个函数。返回的值(又一个函数)是在调用原始函数的名称时将被调用的值。
这个模型可以非常简单:
def my_decorator(fn):
print("Decorator was called")
return fn
在这种情况下,返回的函数与传入的函数相同。但这通常不是你所做的。通常,您返回一个完全不同的函数,或者返回一个以某种方式链接或包装原始函数的函数。
在您的示例中,这是一个非常常见的模型,您有一个返回的内部函数:
def helper(x):
helper.calls += 1
return func(x)
这个内部函数调用原始函数(return func(x)
)但它也会增加呼叫计数器。
这个内部函数被插入作为正在装饰的任何函数的“替换”。所以当你的模块foo.succ()
查找函数,结果是对装饰器返回的内部辅助函数的引用。该函数增加调用计数器,然后调用最初定义的succ
功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)