装饰器的意外行为[重复]

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,而是wrapperfunc 组合而成的闭包。

wraps 是将此类元数据传输到新创建的函数的技巧。

【讨论】:

以上是关于装饰器的意外行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:Python 装饰器的意外关键字参数

Python装饰器

Javascript装饰器的妙用

拦截器和装饰器的区别

6.5装饰器的类型

对@output 装饰器行为感到困惑