假设我有一个返回自己名字的简单函数
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
吗?
答案 0 :(得分:1)
至于装饰器所做的是用包装器替换您的原始函数的原因。所以实际上 foo
不再是 foo
,它是通过组合 wrapper
和 func
创建的闭包。
wraps
是将此类元数据传输到新创建的函数的技巧。