Dum*_*imp 3 python function decorator wrapper
对于下面的功能,我试图理解
一世。为什么wrapper.count = 0在包装函数下面初始化?为什么不在 def counter(func) 下初始化?为什么wrapper.count 没有将其重置wrapper.count为0,因为它在wrapper 函数下方运行?
我试图了解什么是wrapper.count?为什么不初始化一个普通变量count而不是wrapper.count?
def counter(func):
def wrapper(*args, **kwargs):
wrapper.count += 1
# Call the function being decorated and return the result
return func
wrapper.count = 0
# Return the new decorated function
return wrapper
# Decorate foo() with the counter() decorator
@counter
def foo():
print('calling foo()')
Run Code Online (Sandbox Code Playgroud)
装饰器有错误,您需要在包装器函数中:
return func(*args, **kwargs) # instead of `return func`
Run Code Online (Sandbox Code Playgroud)
为什么
wrapper.count = 0在包装函数下面初始化?
因为如果您在包装器函数中执行此操作,那么它将始终重置wrapper.countto的值0。除非您检查它尚未定义。(我在答案的最后给出了一个例子。)
为什么不在下面初始化
def counter(func)?
因为那里没有定义包装函数。所以口译员会抱怨它。
为什么不
wrapper.count重置wrapper.countto0因为它是在包装函数下面执行的?
因为这个语句只在你用@counter装饰器包装一个函数时执行一次,不会每次调用foo()函数时都执行。
我试图了解什么是
wrapper.count?
这是一个函数属性。或多或少类似于staticC++ 等中函数内部的变量。
为什么不初始化一个普通变量
count而不是wrapper.count?
因为那将是一个局部变量,它会count在每次调用时将 重置为 0。
您可以wrapper.count = 0在包装函数内部定义另一种方法。所以现在你不需要在wrapper函数之外定义它。
def counter(func):
def wrapper(*args, **kwargs):
if not hasattr(wrapper, 'count'):
wrapper.count = 0
wrapper.count += 1
return func(*args, **kwargs)
return wrapper
Run Code Online (Sandbox Code Playgroud)