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