python的裝飾器

2021-09-25 15:19:25 字數 1781 閱讀 4308

(本人編寫是基於自己理解,有不對之處還請多多指教)

一、引言

炎熱的夏天到了,每每走到商場都被漂亮的裙子、創意的首飾等等所心動,沒別的是人的愛美的天性使然。在如今社會衣食無憂了,人們開始講究吃飯穿衣的質量問題。好了言歸正傳,今天我想說的就是類似商場的首飾一樣的裝飾器。

在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 要理解上述 的含義,我們從自定義函式裝...