【问题标题】: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 很好。我会删除我的答案。
  • 非常感谢:)

标签: python decorator


【解决方案1】:

至于装饰器所做的原因是用包装器替换您的原始功能。所以实际上foo 不再是foo,而是wrapperfunc 组合而成的闭包。

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

【讨论】:

    最近更新 更多