试图理解 Python 包装器

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)

Mus*_*waz 5

装饰器有错误,您需要在包装器函数中:

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)

  • @warvariuc。你真的关心他的消息来源是什么吗?或者你关心他比你得分多吗? (2认同)