標籤:
再看了很多裝飾器代碼解釋之後,懵懂的我,突然頓悟。主要參考
http://pythonmap.iteye.com/blog/1682696
http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
其實這兩個參考開始都看不下去。完全不懂呀。折磨時候,實驗代碼,隨便折騰,竟然讓我頓悟了。抓到精髓了,再看就簡單了。還有個問題沒有解決,就是裝飾器的用處。主要參考http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 沒理解下去。回頭再看。
裝飾器精髓:扮相,假演員,真演員。 扮相必須攜帶參數,用來接收假演員,真假演員必須攜帶同樣的參數。
某戲台要找出演《智鬥》,演員要化妝成阿慶嫂的模樣,那麼就需要一個是準備阿慶嫂的扮相,另一個是找演員。裝飾器的精髓就是這個。
>>> def a(m): #這個a就是阿慶嫂的扮相... 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
@A
def zhidou():pass
也就是同時有幾個扮相打扮真演員。
具體打扮成什麼樣就看實際應用了。這裡只是一個理解。
下面是帶參的模樣。迷惑部分就不寫了,唯寫有用部分。可以帶幾個參數,現在設定只帶一個參數。還可以b(x,y)等等。
def a(m):
def b(x): return x+x
return b
@a
def zhidou(y): return "hello"
zhidou(3) #運行結果就是一個6,沒有輸出任何“hello”。 這裡又加了一個迷惑部分“hello”,只是為了更清楚,這不部分,無論寫成什麼,都不會起作用。
所以,請記住,裝飾器的三大組成,扮相,假演員,真演員。 扮相必須帶參數,用來接收假演員返回。真假演員必須佩帶相同的參數。
還是挺高興的。編程時候記住三個詞,扮相、假演員、真演員。其他的就隨手拈來。理解了精髓,可以看別人代碼,慢慢學習。
附上 阿慶嫂 扮相一張,振奮一下昏昏欲睡的下午精神
關於python裝飾器的理解