装饰器的意外行为[重复]
Posted
技术标签:
【中文标题】装饰器的意外行为[重复]【英文标题】:Unexpected behaviour with decorator [duplicate] 【发布时间】:2021-08-17 17:27:48 【问题描述】:假设我有一个简单的函数返回它自己的名字
def foo():
print(foo.__name__)
当然调用时的输出是foo
。
但是,如果我们现在用这样的装饰器装饰该函数:
def dec(func):
print(dec.__name__)
def wrapper(*args):
print(wrapper.__name__)
return func(*args)
return wrapper
@dec
def foo():
print(foo.__name__)
foo()
我们得到
dec
wrapper
wrapper
这里为什么叫内部函数的名字?
func(*args)
是专门调用的,不应该是真正的函数名和dec wrapper
之间的关系吗?
【问题讨论】:
这能回答你的问题吗? Get the name of a decorated function? 我想知道原因,不是解决这个问题的办法 哦,我明白了。这回答了你的问题了吗? What does functools.wraps do? “当你使用装饰器时,你是在用另一个函数替换一个函数。” @wjandrea 很好。我会删除我的答案。 非常感谢:) 【参考方案1】:至于装饰器所做的原因是用包装器替换您的原始功能。所以实际上foo
不再是foo
,而是wrapper
和func
组合而成的闭包。
wraps
是将此类元数据传输到新创建的函数的技巧。
【讨论】:
以上是关于装饰器的意外行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章