我试图理解python装饰器。在我写这段代码之前,我想到了某种程度上我理解装饰师。
def func():
def wrapper(x):
return x()
return wrapper
@func()
def b():
return sum
a = b([1,2,5])
print a # Result: 8 How?
e = b # pass b function to variable e
f = e([3,4,8]) # called function b stored in variable e
print f # Result: 15
# I understand how 15 is derived here
答案 0 :(得分:2)
您使用func
作为装饰器工厂,它会生成一个调用原始b()
的装饰器以生成装饰结果。这里发生了什么:
@func()
首先执行func()
,然后使用返回值作为装饰器。 func()
返回wrapper
,因此wrapper
用作装饰器。wrapper(b)
设置x = b
,并返回x()
。因此装饰器的结果是b()
,即sum
。 Python设置b = sum
b([1, 2, 5])
b = sum
。因此返回sum([1, 2, 5])
。这里的重要部分是你使用func
作为装饰器,而不是作为装饰工厂(调用它生成实际的装饰器),这会增加一层间接。