裝飾器和閉包常常為程序員們減少了很多代碼量,在Python學習中,裝飾器和閉包是常用的兩個知識點。今天,我們一塊來學習一下。
裝飾器可以實現在代碼運行期間修改函數的上下文,簡單來説就是,在不改變原函數的情況下,豐富原函數的功能;而閉包簡單來説就是,內層函數調用外層函數的變量,外層函數返回內層函數的引用。兩者也有着密不可分的關係!!!
閉包函數
閉包函數是函數嵌套、函數對象、名稱空間與作用域結合體
閉包中被內部函數引用的變量,不會因為外部函數結束而被釋放掉,而是一直存在內存中,直到內部函數被調用結束
説了這多理論,上代碼。
需求:統計下載媒體文件的時間(簡易版)
以上代碼確實實現了統計下載時間的功能,問題來了,如果我有多個類型文件下載函數,都需要統計時間呢?難道展現我們的“CV大法”?估計隔天就要被掃地出門了……
就沒有什麼辦法可以解決了嗎?當然有啦!先看代碼
以上代碼就是對裝飾器的引入,其中 time_record 就是裝飾器,download_movie 和 download_music 就是被裝飾的函數對象。
通過觀察,以上被裝飾的函數對象是沒有返回值,且沒有參數的。問題來了,假如 download_movie 等被裝飾對象是有返回值和參數,那該咋整?
不説廢話,繼續看代碼
細心如你,裝飾器定義好了,但是每次調用都特別麻煩,有沒有一種比較便捷的調用方式呢?
噹噹噹當!當然有,那就是裝飾器的語法糖,聽起來就感覺使用非常甜,咋用呢?繼續看代碼(由於之前代碼已經實現了裝飾器,這裏就不重複展示了,只實現語法糖的代碼)
裝飾器語法糖
注意:在使用時,裝飾器必須在被裝飾對象之前定義
怎麼樣?是不是感覺意猶未盡?是不是急着想自己練習一下呢?那就行動起來吧!!!