Decorator學習筆記

初學者,本身的理解,請各位前輩不吝指正!html

     Decorator,裝飾模式,設計模式之一,談談個人理解,裝飾這個詞在我概念中就是給某個事物加上一些美麗的外表,把它變得更加完美。可是裝飾是能夠隨時改變的,能夠拆下來換新的,換個裝飾風格也不用拆房子。並且好的裝飾,從這裏拆下來還能夠在那裏用,甚至於返返工,就能夠屢次利用。在程序裏,引入裝飾的概念,在我淺薄的理解中,能夠歸結成爲抽象和封裝(這倆個概念我也不是特別懂,本身理解中應該是這樣)。python

  從實際應用的角度來說,就是有某一操做須要屢次重用,並且這一重複操做中會嵌套各類不一樣核心代碼(其實就是爲了實現這段代碼,能夠比做房子),普通的作法就是複製粘貼100遍。好比說:設計模式

 1 def hit(user,boss):           #好比說是打擊boss動做
 2     if check(user):
 3       user_hit(boss)
 4   else:
 5     print 'user error'
 6 def buy(user,thing):             #買東西
 7   if check(user):
 8     user_buy(thing)
 9   else:
10     print 'user error'   
11 def sell(user,thing):              #賣東西
12   if check(user):
13     user_sell(thing)
14   else:
15     print 'user error'
16              .
17              .
18              .

 

   假如這段不能運行的代碼表明着某RPG裏面的各類玩家動做,按規矩,起碼在這些動做以前得肯定一下是否是本人操做,這樣寫下去也沒錯,起碼全部動做寫到了,那就都能執行了,遊戲也能夠玩了,可是有一句老話嘛,儘可能少作重複的輪子,而check這個輪子,被重複的太屢次了,並且一旦須要你寫每一步的錯誤日誌,豈不是須要再加100次寫日誌的操做?app

  想一個解決辦法,把全部的操做都當成屋子,而檢查用戶當成裝飾品,具體怎麼作呢?學習

def checked(method):
    def wrapper(user, *args):
        if not check(user):
            print 'user error'
        else:
            return method(user, *args)
    return wrapper
@checked
def hit(user, boss):
    user_hit(boss)    

  這個樣子一來,全部操做以前只須要加上@checked就能夠了,並且加錯誤日誌只須要修改checked即可完成,玩家操做就是咱們的屋子,屋子裝飾風格使用@checked來肯定。裝飾風格想要變換,重寫裝飾風格便可。spa

學習http://www.cnblogs.com/SeasonLee/articles/1719444.html有感設計

                                                                   ----------python小學生日誌

相關文章
相關標籤/搜索