關於python裝飾器的理解

來源:互聯網
上載者:User

標籤:

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

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裝飾器的理解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.