【python】閉包與裝飾器

weixin_34393428發表於2018-05-24

# 本次講述的知識點也是非常重要的(嚴肅臉)

# 先有的閉包,之後才生成了裝飾器,同樣的也是非常簡單的東西。


# 閉包

結構組成;


11679269-00c4efe49a73cd63.png
閉包

寫法;外層函式返回內層函式的引用,外層函式必須要有引數!

作用;執行函式的時候我們可以把外層函式的引數儲存在記憶體中!

# 具體是如何演化成裝飾器的呢?

我記得當初學習裝飾器的時候,樣哥講裝飾器就是表面意思,等於就是在一個事物上新增附加條件的過程,所以裝飾器在工作上運用的蠻多的,簡單易用!(有點廢話~~)

現在我們說說裝飾器的演變過程;

1. 我們先定義一個閉包,外層函式set_fun()與內層函式call_fun(),外層函式傳入引數func,內層函式呼叫func(),另外在閉包外建立text()函式,列印text。這個時候我們已經差不多寫完了整個程式了,就剩下最後的執行步驟,我們可以先想一個問題,裝飾器是來新增附加東西的,所以我們可以簡單的在閉包裡的內層函式新增一些東西,這裡我們就列印“許可權”來代表新增的東西(畢竟裝飾器的初衷就是如此),接下來我們來使兩者聯絡並且執行起來;

call_fun = set_fun(test)

call_fun() 


11679269-e52c955d9efef4dc.png
原始碼截圖

這樣,整個程式就都聯絡起來了,執行後會發現在輸出的text之上加了一個許可權兩字,對!就是我們剛剛新增的!棒棒噠!附圖;


11679269-22a0ec556070f4b8.png
執行結果

#話說,其實這個時候我們已經完成了裝飾器的功能,等等!這還是裝飾器的最初形態,我們還可以將其變得更簡潔,更好~~~往下翻~


2.  演變第二部,我們只需把執行程式碼行的call_fun 改成 text~~~~嗯?改變不大?對,是的,改變不大,別慌,我們還有演變最終版呢!這個過渡很重要的; 


11679269-9a39f3b6db63d120.png
演變2

# 功能還是那個功能,結果還是那個結果!這其中其實是有一個指向問題,1中的text指向是call_fun ,而現在這一層指向是經過call_fun後又指向了func,這個時候text()=func(),雙層指向更能直觀的顯示我們的所需要的目的!最終版要來咯~~~


#終版

# 這最終版就叼了,簡直瑟瑟發抖~~~哈哈,不皮了~~

#這其中要運用到一個叫做語法糖的東西,顧名思義就是粘住你(這裡是函式),在函式前新增 @+閉包外層函式名,就形成了我們最終版的裝飾器;

11679269-4c147ab1b0c08669.png
裝飾器

#語法糖的出現就減去了一行呼叫程式碼,程式碼優化還是很明顯的!之後再執行函式就行了,完全不用管裝飾器,已經自動執行了。就如圖所示,在函式前加入語法糖就行(@set_fun==》text = set_fun(text)  )

# 到這裡,我們就明白了裝飾器的功能的同時,又理解了其中的呼叫過程,沒有什麼技術性的東西,全都是一些固定的用法,所以我們就可以做一個萬能裝飾器,完全不用我們去我們編寫裝飾器那種,嘿嘿;


11679269-222eb1eb1fce2451.png
萬能裝飾器

#一般來說,裝飾器涉及了很多種情況;

# 裝飾我們的函式分為四組情況

#  1. 無參,無返回

#  2. 無參,有返回

#  3. 有參,無返回

#  4. 有參,有返回

而且,在道德上我們是不會更改函式的值和呼叫方式的,以上四種情況我在這就不說明了,別人應該寫的比我更好,本次只是簡述了閉包和裝飾器的生成過程!


# 總結;

生命有限,重在珍惜!時間更是越用越少,學習成為生命有意義的體現,更多的是滿足自己的精神世界,每天分享的東西不多,但只要一直學習,便不會孤獨!

相關文章