今天我們來聊聊一種能給你的代碼變得“加料”的神器——Python裝飾器。
就像一杯咖啡,原本它是苦的,為了讓它符合我的口味,我給它添加了糖,添加之后就完美的符合了我的口味。
那么,裝飾器又是如何給代碼進行“加料”呢?
Python裝飾器提供了一個更為優雅的方式來增強現有函數的行為,并且不需要修改現有的函數代碼及調用方式。
接下來通過一個案例來介紹一下裝飾器的原理和實際的行為。
這里有一個函數,他就像一個勤勞的快遞員,每次運行都送一次快遞。
現在我們想知道它每次送快遞需要多長時間,這時候裝飾器就派上用場了,我們可以使用裝飾器來給它添加計時的功能。
這是使用語法糖給函數添加裝飾器的用法。
下面的部分稱為原函數,上面的部分稱裝飾器函數,此時去調用原函數時,它除了會執行原本的功能外,還會執行裝飾器給它添加的計時的功能。
這是裝飾器最常見的寫法,但它是怎么給函數增加新功能的呢?我們來看去除掉語法糖后裝飾器的本來面目。
如果不使用語法糖,它本質上就是裝飾器函數的一次調用,特殊的是它會將原函數作為參數傳遞給裝飾器函數。而在裝飾器函數中,它接收一個函數作為參數,并且在它的內部定義了一個新的函數,最后將新函數進行返回。在這里我們稱timer decorator為外函數,稱wrapper為內函數,而這個func就是原函數。
外函數將內函數名稱進行返回并賦值為原函數的函數名,下面在調用原函數的函數名時,實際上調用的是內函數。
內函數被執行后,首先會記錄當前時間,然后調用func,func是什么?是外函數的形參,這里可能有人會疑惑,外函數已經執行完了,為什么func還會存在呢?
這其實就是裝飾器函數的立身之本:內函數所使用的外函數數據不會隨著外函數的調用而銷毀,所以此時func就指向了原函數,在調用內函數時,這里的func()可以去執行原函數,接著記錄一下時間,最后通過差值得到執行函數所需要的時間。至此,通過裝飾器我們不僅為原函數添加了新的功能,并且還沒有修改其調用方式。
而語法糖的存在就是為了省略這一行代碼,由此就形成了我們常見的裝飾器了。
完整視頻鏈接:
https://www.bilibili.com/video/BV1fGHDepExY?t=1.2
-
AI
+關注
關注
87文章
30946瀏覽量
269191 -
人工智能
+關注
關注
1791文章
47314瀏覽量
238620 -
python
+關注
關注
56文章
4797瀏覽量
84720
發布評論請先 登錄
相關推薦
評論