gpt4 book ai didi

python - 试图理解 Python 包装器

转载 作者:行者123 更新时间:2023-12-04 00:19:22 25 4
gpt4 key购买 nike

对于下面的函数,我试着去理解

我。为什么 wrapper.count = 0 在 wrapper 函数下面初始化?为什么不在 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()')

最佳答案

装饰器有错误,你需要在包装函数内部:

return func(*args, **kwargs)  # instead of `return func`

Why is wrapper.count = 0 initialised below the wrapper function?

因为如果你在包装函数中执行此操作,那么它总是会将 wrapper.count 的值重置为 0。除非您检查它是否尚未定义。 (我在回答的最后给出了一个例子。)

Why not initialised below def counter(func)?

因为这里没有定义包装函数。所以口译员会提示的。

And why doesn't the wrapper.count reset the wrapper.count to 0 since it is executed below the wrapper function?

因为这个语句只在你用 @counter 装饰器包装函数时执行一次,并且不会在你每次调用 foo() 函数时执行。

And I'm trying to understand what is wrapper.count?

这是一个函数属性。或多或少类似于 C++ 等函数中的 static 变量。

Why not just initialise a normal variable count as opposed to 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

关于python - 试图理解 Python 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61790669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com