標籤:
前幾天向幾位新同事介紹項目,被問起了@login_required的實現,我說這是django架構提供的裝飾器方法,驗證使用者是否登入,只要這樣用就行了,因為自己不熟,並沒有做過多解釋。
今天查看django官網,忽然發現,裝飾器用法並不是django架構提供的,而是python的一種文法,真心汗一個,自以為python用的很熟了,看來是井底之蛙!
恰逢周末,靜下心來瞭解一下python的裝飾器方法。
談到代碼裡的裝飾器,很自然的想到了設計模式中的裝飾器模式,為了防止再次張冠李戴,特意翻了翻設計模式的書,確定python裝飾器文法的功能就是類似於裝飾器模式要實現的功能。
關於python裝飾器文法,簡單的說就是把要執行的方法foo用一段程式碼封裝裝起來,在調用foo方法的前前後後增加一些邏輯,然後把這個新方法賦給foo。
也可以在封裝的邏輯裡寫一個封裝方法,傳入參數,進行一些操作。注意一點,有多個裝飾器方法封裝foo時,應該是按照從下往上的順序進行封裝。
def before(pre=‘‘): def dec(f): def wrapper(): print pre + " before function" f() return wrapper return decdef middle(f): def wrapper(): f() print "middle function" return wrapperdef after(f): def wrapper(): f() print "after function" return wrapperdef nextbefore(f): def wrapper(): print "nextbefore function" f() return wrapper@middle@after@nextbefore@before("hello")def test(): print "I‘m tester"if __name__ == ‘__main__‘: test()
列印的結果:
>>> nextbefore functionhello before functionI‘m testerafter functionmiddle function>>>
python裝飾器方法