python(八)裝飾器

2021-07-12 02:34:27 字數 1802 閱讀 9856

摘要

裝飾器,在python中在面向過程程式設計的層面實現了oop中的「裝飾」設計模式!作為高階函式的乙個延生,在python中應用廣泛!

python中的裝飾器,是對「高階函式」的一種延生。使用它可以對函式進行增強,這樣的方式就好像是oop中的「裝飾」設計模式所體現出來的效果一樣。

1,簡單裝飾器

先來看乙個高階函式的例子,哈,回顧一下

然後,把函式「now」用函式「log」給裝飾一下,就像是這樣子:

通過在函式定義時,使用「@fn」來裝飾該函式

,這就是python中的裝飾器。

經過上面的例子,同時我們也能得到這麼乙個結論就是:

@log == log(now) 

這個,就是python裝飾器最本質的東西!

於是,上面的例子,當我們直接呼叫「now」函式的時候就會變成這樣:

那在呼叫函式「now」的時候,同時列印出了一條「log」資訊,這樣就增強了「now」的功能,這種就稱為是:裝飾器!

2,帶參裝飾器

那現在,如果你準備在呼叫裝飾器的時候,同時可以傳遞一些引數,又該怎麼做呢?

首先,還是要從高階函式的角度來看,所以,可以模擬成這樣子:

那上面高階函式的寫法,轉換成裝飾器,就應該是這樣子:

然後,我麼就可以直接呼叫函式「now」:

那這樣,是不是就實現了乙個帶引數的裝飾器呢?

其實,只要明白一點,裝飾器其實也很好理解。

我們在函式「now」上,通過增加「@log」,其實就是說:在呼叫「now」之前,先把「now」當做引數傳遞到「log」方法中執行一次。然後,由於,我們後續還需要再次呼叫「now」,所以,傳遞到「log」內部的「now」必須還得再返回,那這樣的乙個過程,就是裝飾器的「執行」過程!

3,正規的寫法

上面實現的裝飾器,在裝飾器的內部我們直接返回了外部的那個「now」函式,那麼當我們在外部手動呼叫「now」函式的時候就會出現函式的返回值變成了它本身,所以我們應該在裝飾器的內部,顯式的呼叫一下「now」函式,並且返回它的返回值!

首先,我們針對不帶參的裝飾器做乙個改造。

改造的過程是這樣:當我們呼叫裝飾函式「log」的時候,它不再是直接執行,而是在其內部又定義了乙個函式,然後返回這個函式。那這個過程等價於這樣: @log => now = log(now);

當然,對於帶參的裝飾器,就可以對應的這麼寫:

帶引數的裝飾器,對於不帶參的而言,只是需要再通過一層函式來包裝一下而言。

備註:一定要認真理解,理解透徹,方成正道!

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