2016-07-27 63 views
1

我想了解Python裝飾器。我以爲不知何故我理解裝飾器,直到我寫這個代碼。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

我認爲谷歌給出了最好的答案。 https://realpython.com/blog/python/primer-on-python-decorators/ –

回答

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作爲裝飾器,而是作爲裝飾器工廠(調用它產生實際的裝飾器),它添加了一個間接層。