装饰器的意外行为

时间:2021-05-29 22:39:22

标签: python decorator

假设我有一个返回自己名字的简单函数

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 吗?

1 个答案:

答案 0 :(得分:1)

至于装饰器所做的是用包装器替换您的原始函数的原因。所以实际上 foo 不再是 foo,它是通过组合 wrapperfunc 创建的闭包。

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