關於python裝飾器的理解

2022-09-01 00:09:19 字數 4430 閱讀 7185

再看了很多裝飾器**解釋之後,懵懂的我,突然頓悟。主要參考

其實這兩個參考開始都看不下去。完全不懂呀。折磨時候,實驗**,隨便折騰,竟然讓我頓悟了。抓到精髓了,再看就簡單了。還有個問題沒有解決,就是裝飾器的用處。主要參考 沒理解下去。回頭再看。

裝飾器精髓:扮相 a,假演員 b,真演員 zhidou。     扮相必須且只能攜帶乙個引數,用來接收假演員回傳,真假演員必須帶同個數引數。只能執行假演員規定動作。

某戲台要找出演《智鬥》,演員要化妝成阿慶嫂的模樣,那麼就需要乙個是準備阿慶嫂的扮相,另乙個是找演員。裝飾器的精髓就是這個。

>>> def a(m):    #

這個a就是阿慶嫂的扮相,這裡的引數m就是傳入的真演員。

... print

"hello"#

迷惑敵人

... def b(): #假設演員是 b

... return

"a qing sao

"#這個是演員在這部戲裡面需要做的事情

...

print

"world"#

迷惑敵人

... return b #

這個 b 就是演員,把 b 塞到 a 的扮相下

...

#上面就定義好了阿慶嫂的扮相和演員要做的事情

>>> @a #

這個表示下面出場的是阿慶嫂

... def zhidou(): #

出演的演員名字是zhidou()

... print

"diao de yi"#

迷惑敵人

... return

"sha jia bang"#

迷惑敵人

...

hello

#迷惑敵人

world #

迷惑敵人

>>> zhidou() #

大幕拉開,演員zhidou已經化好妝上台,開始表演了

'a qing sao

' #看到了吧,輸出只有規定好的動作,其他的都是浮雲。

分析上面的**,其中「迷惑敵人」的部分不用理,去掉,剩下的精髓就是阿慶嫂的扮相 a 和假定的演員 b 以及最後出演的真實的演員 zhidou 這三個部分。

其中扮相 a 必須攜帶乙個引數,而且只能攜帶乙個引數,這個引數是用來接收最後假定的演員 b ,在扮相 a 的面具下塞入 b。

還要有乙個真實演員 zhidou,這就行了。簡化**。 而真正演員要做的事情,就是b裡面規定的內容,其他地方無論是什麼都是在開演前迷惑觀眾,宣傳造勢用的。

真正開演了,就做一件事情,就是b裡面規定的事情。

def a(m):   #阿慶嫂扮相

def b(): pass   #演員要做的事情

return b    #把 b 塞到 阿慶嫂的扮相下

@a              #按照 a 的標準打扮的說明文字

def zhidou(): pass   #真演員開始化妝

zhidou()   #真演員開演

上面舉例是演員 b 不帶引數的,那麼真演員 zhidou 也要不帶引數。

如果 b 帶著引數,那麼 zhidou 也要帶相同的引數

這樣才可以演嘛。

但是無論怎麼變, 扮相 a 裡面只能帶乙個引數,而且只能帶乙個,返回值,也必須是這個假演員。

那麼這個裝飾器的作用是什麼呢? 目前看是可以按不同扮相打扮真演員。

比如@a

@adef zhidou():pass

也就是同時有幾個扮相打扮真演員。

具體打扮成什麼樣就看實際應用了。這裡只是乙個理解。

下面是帶參的模樣。迷惑部分就不寫了,只寫有用部分。可以帶幾個引數,現在設定只帶乙個引數。還可以b(x,y)等等。

def a(m):

def b(x): return x+x

return b

@adef zhidou(y): return "hello"

zhidou(3)  #執行結果就是乙個6,沒有輸出任何「hello」。 這裡又加了乙個迷惑部分「hello」,只是為了更清楚,這不部分,無論寫成什麼,都不會起作用。

所以,請記住,裝飾器的三大組成,扮相,假演員,真演員。 扮相必須帶引數,用來接收假演員返回。真假演員必須佩帶相同的引數。

還是挺高興的。程式設計時候記住三個詞,扮相、假演員、真演員。其他的就隨手拈來。理解了精髓,可以看別人**,慢慢學習。

附上 阿慶嫂 扮相一張,振奮一下昏昏欲睡的下午精神。

但是注意的是,上面例子中的真演員的動作忽略沒有執行。那麼如何執行真演員的動作呢?第二個精髓:裝飾器只能執行假演員規定動作。

扮相攜帶的引數,就是真演員函式,因為只能執行假演員規定的動作,所以要把真演員函式放到假演員函式中執行。

上面的扮相,真假演員的理解中,真演員規定的動作並沒有執行,只是執行了假演員執行的動作。那麼現在要加進去真演員的動作。

def a(m):

def b(x,y):

print "hello",m(x,y)   #這裡把真演員的動作調入

return b

@adef k(x,y):

return 「%s wolaile %s」 % (x,y)

執行 k("xiaoq","world") 結果為   hello xiaoq wolaile world    這樣就將真假演員的動作都合在一起了。這樣的 a 扮相叫做裝飾器,借用設計假演員的動作,包裝真演員。同時還不遺漏真演員的動作。這樣真演員中的函式部分就不是迷惑敵人的用處,就可以使用了。

所以現在可以學著使用裝飾器。乙個場合是給真演員加點附加的運算。主要設計是放在b裡面

舉例

>>> class

c(object):

...

def__init__

(self,x,y):

... self.name=x

... self.language=y

...

defshow(self):

...

print self.name,"

+++"

,self.language

## 上面定義了乙個類 c

>>> def

a(m):

...

defb(x,y):

... kk=m(x,y) #

執行了真演員的動作,獲取返回資訊

... print

"hello

",kk[0],kk[1] #

設計真演員動作

... return

b...

>>>@a

...

def k(x,y): #

真演員動作

... c=c(x,y)

...

return c.name,c.language #

把資訊返回供扮相 a 設計。

...

>>> k("

xiaoq

","china")

hello xiaoq china

#記住一點,執行的一定只有 b 裡面規定的內容,其他都是浮雲。

好了,現在真假演員如何包裝的已經看懂了,應用也了解了,可以去看別人**了。 記住一點,扮相帶參,真假演員,執行的是指假演員規定的動作。

注意裝飾器和內建巢狀函式的區別。 內建巢狀函式不常用,外建巢狀函式常用,其實單獨定義乙個函式a,然後在定義另外乙個函式b的時候,使用這個函式a而已。

python多用類函式,模組函式。很少使用自定義的內建巢狀函式。基本沒有。所以這裡注意和內建巢狀函式區分開。

但是有一種巢狀函式的閉包特性 

>>> def

test():

... a=

...

deff():

...

return a['

name']

...

return

a,f...

>>> a,f =test()

>>>f()

'wyj

'>>>a

>>> a['

name

']='

weklj'#

指定了a的修改

>>> f() #

f的值也跟著改了。 好奇怪。這裡需要研究一下。待定。

'weklj'#

想象中,也許,a和f在賦值test()的時候就已經按照test的規則規定了它們的關係,潛藏著某種運算規則,

所以,a改了,f也隨著改了。從賦值 a,f=test() 開始,就決定了a和f之間的某個法則,就是test規定的內容。

關於Python中的裝飾器理解

裝飾器的作用就是 重用!import time 定義乙個能夠直接測試程式執行時間的 def timenumber func fronttime time.time func endtime time.time print 這個程式花了 f毫秒 endtime fronttime 1000 def m...

python裝飾器理解 python裝飾器理解

裝飾器 在不改變原函式的 和呼叫方法的基礎上,給原函式增加額外的功能 理解宣告 為了方便理解,以下例子採用最簡潔的函式和新增的功能 給原函式新增乙個執行時間 import time def timer func def inner func return inner timer func timer...

python裝飾器 理解Python裝飾器

在python中,對於乙個函式,若想在其執行前後做點什麼,那麼裝飾器是再好不過的選擇,話不多說,上 usr bin env coding utf 8 script 01.py author howie from functools import wraps def decorator func wr...