python decorator如何处理这段代码?

时间:2016-07-27 07:23:12

标签: python python-2.7 decorator python-decorators

我试图理解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

1 个答案:

答案 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作为装饰器,而不是作为装饰工厂(调用它生成实际的装饰器),这会增加一层间接。