(本人編寫是基於自己理解,有不對之處還請多多指教)
一、引言
炎熱的夏天到了,每每走到商場都被漂亮的裙子、創意的首飾等等所心動,沒別的是人的愛美的天性使然。在如今社會衣食無憂了,人們開始講究吃飯穿衣的質量問題。好了言歸正傳,今天我想說的就是類似商場的首飾一樣的裝飾器。
在python中我們編完程式後,有時候想給他增加一些附加功能,但是又不想改變原**,那怎麼辦呢?裝飾器來幫你搞定,那什麼是裝飾器?裝飾器怎麼使用呢?
二、什麼是裝飾器
(1)簡單理解
裝飾器是用來修飾其他函式,為其他函式新增附加功能。
裝飾器的本質是有返回值的函式,返回值也是乙個函式。
(2)裝飾器的原則
新增裝飾器,對原函式的執行無任何影響。詳細說:
不能修改被修飾的函式的源**;
不能修改被修飾函式的呼叫方式。
(3)實現的原理
原理有點偷梁換柱的感覺,為什麼呢?下面我用乙個簡單的例子,通俗的講一下:
例子:加入主函式中有個a程式要執行,我們要將a增加乙個記錄執行時間的功能:
解釋:實際我們是定義乙個巢狀函式,外層函式的引數為被修飾函式的名字a,內層函式(b)增加計時功能,並呼叫修飾函式,結果返回值為內層函式的名字b(此時的a已經是增加計時功能的a—b(a)了,是不是偷梁換柱呢)
不明白的可以接著往下看具體例項。
說明,以下我們以給小朋友分發小禮物為例子講解三種程度的裝飾,小朋友是被修飾函式,戴皇冠(或者發小汽車)是裝飾器。
三、被修飾函式無引數
(2)執行結果:
(3)**解釋
@crown在第一段執行時:
1.先是在python直譯器的解釋下,進入demo函式體存放在記憶體中,之後返回demo,即crown執行結果是dingding_girl=crown(dingding_girl)=demo的記憶體位址;
2.之後進行dingding_girl()的執行就是demo(),也就是我所謂的偷梁換柱。
四、被修飾函式有引數
(1)問題
如果被修飾的函式,有的帶引數,有的不帶引數,那麼裝飾器的使用就會報錯如圖所示:
(2)借助不定引數(或稱引數組)進行解決
五、裝飾器含引數
假如只給女孩戴煥冠,給男孩發小汽車那這個程式如何修改呢?
解決辦法,呼叫前判斷一下性別就好了。
(2)執行結果
是不是很驚喜,可以根據性別給小朋友發禮物了(此處鼓勵一下自己,o( ̄︶ ̄)o)
(3)解釋
其實這步只是增加了一層判斷性別。根據性別派發禮物,巢狀多增加一層而已。
到此給小朋友分發禮物的裝飾器講完了。在一些許可權管理、日誌新增等等場景中,希望實際工作中能有所幫助。
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...
python裝飾器原理 Python裝飾器原理
裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...