<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] 參考鏈接 * [銀角大王講裝飾器](http://www.cnblogs.com/wupeiqi/articles/4980620.html#undefined) * [Python 迭代器/生成器/裝飾器](https://www.jianshu.com/p/c77b71a690db) ## **引子** ### 開放封閉原則 在一個已經正常運行的項目中,對項目功能的增加,需要遵循開放封閉原則. 簡單來說,它規定已經實現的功能代碼不允許被修改,但可以被擴展,即: * 封閉:已實現的功能代碼塊不應該被修改 * 開放:對現有功能的擴展開放 ### 不改變調用原則 對已經功能的增改,不能修改原模塊(函數)的調用方式,因為一個模塊(函數)可能已經在N個地方使用了,如果改變了調用方式,就需要修改N個地方 ## **裝飾器** 裝飾器的作用就是**在不修改原函數的情況下添加新功能**,相當于高階函數(將函數作為參數傳入)和嵌套函數的結合. ### 裝飾器基本格式: ```python def 裝飾器函數(傳入的函數): def 執行的嵌套函數(傳入函數的參數): 裝飾器語句 ... return 傳入的函數(傳入函數的參數) ... 裝飾器語句 return 返回的嵌套函數 @裝飾器函數 def 原函數 原函數模塊... ``` ### 無參數的裝飾器 ```python def w1(func): def inner(): # 驗證1 # 驗證2 # 驗證3 return func() return inner @w1 def f1(): print 'f1' ``` ### 參數格式已知的裝飾器 ``` def w1(func): def inner(arg1,arg2,arg3): # 驗證1 # 驗證2 # 驗證3 return func(arg1,arg2,arg3) return inner @w1 def f1(arg1,arg2,arg3): print 'f1' ``` ### 參數格式未知的裝飾器 ``` def w1(func): def inner(*args,**kwargs): # 驗證1 # 驗證2 # 驗證3 return func(*args,**kwargs) return inner @w1 def f1(arg1,arg2,arg3): print 'f1' ``` ### 多個裝飾器裝飾一個函數 ``` def w1(func): def inner(*args,**kwargs): # 驗證1 # 驗證2 # 驗證3 return func(*args,**kwargs) return inner def w2(func): def inner(*args,**kwargs): # 驗證1 # 驗證2 # 驗證3 return func(*args,**kwargs) return inner @w1 @w2 def f1(arg1,arg2,arg3): print 'f1' ``` ## 裝飾器流程詳解 ### 1.簡單代碼 以上面的無參數的裝飾器來做解釋 ``` def w1(func): def inner(): # 驗證代碼1 return func() return inner @w1 def f1(): print 'f1' ``` ### 2.代碼執行步驟 當寫完這段代碼后(函數未被執行、未被執行、未被執行),python解釋器就會從上到下解釋代碼,步驟如下: 1. `def w1(func): ` ==>將w1函數加載到內存 2. `@w1 ` 沒錯,從表面上看解釋器僅僅會解釋這兩句代碼,因為函數在沒有被調用之前其內部代碼不會被執行。 從表面上看解釋器著實會執行這兩句,但是 @w1 這一句代碼里卻有大文章,@函數名 是python的一種語法糖。 ### 3.將原函數作為參數傳給新函數 如上例@w1內部會執行一下操作: **執行w1函數**,并將 @w1 下面的 函數 作為w1函數的參數,即:@w1 等價于 w1(f1) 所以,內部就會去執行: ``` def inner: #驗證 return f1() # func是參數,此時 func 等于 f1 return inner # 返回的 inner,inner代表的是函數,非執行函數 ``` >其實就是將原來的 f1 函數塞進另外一個函數中 ### 4.新函數執行完畢后再將原函數return返回 將執行完的 w1 函數**返回值賦值**給@w1下面的函數的函數名 ``` w1函數的返回值是: def inner: #驗證 return 原來f1() # 此處的 f1 表示原來的f1函數 然后,將此返回值再重新賦值給 f1,即: 新f1 = def inner: #驗證 return 原來f1() ``` >所以,以后業務部門想要執行 f1 函數時,就會執行 新f1 函數,在 新f1 函數內部先執行驗證,再執行原來的f1函數,然后將 原來f1 函數的返回值 返回給了業務調用者。 如此一來, 即執行了驗證的功能,又執行了原來f1函數的內容,并將原f1函數返回值 返回給業務調用著
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看