循序漸進Python裝飾器(二)

我們繼續(xù)講解Python裝飾器。上一講我們把裝飾器的基本原理講了毅戈,這一講我們來談?wù)勓b飾器相關(guān)的語法。

1. @是語法糖

下面這兩段代碼是等效的,與其讓decorator顯式接收一個func作為參數(shù)敦第,然后將調(diào)用后得到的結(jié)果賦值給func變量,我們可以直接在定義的func前加上@decorator語句也能達到相同的效果店量,而且更方便芜果。我們把這個@語句稱為語法糖。


所謂語法糖可以理解成是實現(xiàn)特定功能的捷徑融师,它簡化了我們編寫代碼的方式右钾。這里的@語句在定義函數(shù)時使用,使代碼更容易閱讀并且可以立即意識到應(yīng)用了裝飾器。值得一提的是舀射,在Python中語法糖是大量存在的窘茁,而不僅僅是局限于裝飾器中。

簡單一點的脆烟,假如我們要構(gòu)建一個列表山林,此時的[1,2,3]相對于list(1,2,3)就是語法糖。復(fù)雜一點的邢羔,假如我們要創(chuàng)建一個迭代器驼抹,寫一個生成器函數(shù)相對于直接構(gòu)造一個迭代器的類就是一種語法糖,而寫一個生成器表達式則是相比于生成器函數(shù)更進一步的語法糖拜鹤。

2. 裝飾器在被裝飾的函數(shù)定義后立即運行

理解裝飾器在何時運行的問題是我們理解被裝飾過的函數(shù)的種種行為的基礎(chǔ)框冀。


可以看到,裝飾器函數(shù)在自身和被裝飾函數(shù)定義完成后敏簿,會立即被調(diào)用明也,也就是說裝飾器在被加載到模塊后會立即運行。而裝飾后的函數(shù)f极谊,只有顯式調(diào)用才會被執(zhí)行诡右。那么原函數(shù)呢?這里原函數(shù)和被裝飾后的函數(shù)是同一個轻猖,更常見的情況是被裝飾后的函數(shù)包含對原函數(shù)的引用帆吻,顯式調(diào)用被裝飾后的函數(shù)也會順帶調(diào)用原函數(shù)。

3. 對一個函數(shù)應(yīng)用多個裝飾器

對一個函數(shù)應(yīng)用多個裝飾器從整體上來理解就是對裝飾后得到的被裝飾函數(shù)再進行裝飾咙边。


多個裝飾器也不限于兩個猜煮,也可以多次使用同一個裝飾器



下面把整段代碼貼出來和大家一起分析下



這段代碼中有以下幾點值得注意:
  1. 這里面的fwarpper1败许、warpper2都是使用相同的位置參數(shù)王带,這一點很重要,是確保裝飾器能正確運行的前提市殷。
  2. 這個裝飾的過程是自里向外的愕撰,我們先裝飾f得到wrapper1,再裝飾wrapper1得到warpper2醋寝。

注意到以上兩點后我們再來看裝飾后的f的運行情況搞挣。當(dāng)我們調(diào)用f("haha")時,其實相當(dāng)于運行warpper2("haha")音羞,warpper2在運行時又會調(diào)用warpper1囱桨,并把從位置參數(shù)text接收來的變量值"haha"傳給wrapper1wrapper1在運行時又會調(diào)用真正的f嗅绰,然后也把從位置參數(shù)text接收來的變量值"haha"傳給f舍肠,最后f運行完成搀继,又返回到wrapper1wapper1運行完成返回到wrapper2翠语,wrapper2運行完成這個函數(shù)才算結(jié)束叽躯。

4. *args, **kwargs

通常我們在定義裝飾器時,為了裝飾器能更加的通用肌括,需要考慮到被裝飾的函數(shù)參數(shù)個數(shù)不一致的問題险毁。就比如上面定義的的那個裝飾器,它要求被裝飾的函數(shù)只能有一個參數(shù)们童,因為我們后續(xù)調(diào)用時,只能給被裝飾后的函數(shù)wrapper一個參數(shù)鲸鹦。而wrapper恰恰是代替原函數(shù)f接受調(diào)用的慧库。


知道了問題所在,我們讓wrapper接受可變的參數(shù)個數(shù)也就解決問題了馋嗜。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齐板,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葛菇,更是在濱河造成了極大的恐慌甘磨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眯停,死亡現(xiàn)場離奇詭異济舆,居然都是意外死亡,警方通過查閱死者的電腦和手機莺债,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門滋觉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人齐邦,你說我怎么就攤上這事椎侠。” “怎么了措拇?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵我纪,是天一觀的道長。 經(jīng)常有香客問我丐吓,道長浅悉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任汰蜘,我火速辦了婚禮仇冯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘族操。我一直安慰自己苛坚,他們只是感情好比被,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泼舱,像睡著了一般等缀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娇昙,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天尺迂,我揣著相機與錄音,去河邊找鬼冒掌。 笑死噪裕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的股毫。 我是一名探鬼主播膳音,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铃诬!你這毒婦竟也來了祭陷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趣席,失蹤者是張志新(化名)和其女友劉穎兵志,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣肚,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡想罕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钉寝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弧呐。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌纲,靈堂內(nèi)的尸體忽然破棺而出俘枫,到底是詐尸還是另有隱情,我是刑警寧澤逮走,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布鸠蚪,位于F島的核電站,受9級特大地震影響师溅,放射性物質(zhì)發(fā)生泄漏茅信。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一墓臭、第九天 我趴在偏房一處隱蔽的房頂上張望蘸鲸。 院中可真熱鬧,春花似錦窿锉、人聲如沸酌摇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窑多。三九已至仍稀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埂息,已是汗流浹背技潘。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留千康,地道東北人享幽。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像拾弃,于是被迫代替她去往敵國和親琉闪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容