<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Python中decorator使用實例

        來源:懂視網 責編:小采 時間:2020-11-27 14:32:37
        文檔

        Python中decorator使用實例

        Python中decorator使用實例:在我以前介紹 Python 2.4 特性的Blog中已經介紹過了decorator了,不過,那時是照貓畫虎,現在再仔細描述一下它的使用。 關于decorator的詳細介紹在 Python 2.4中的What's new中已經有介紹,大家可以看一下。 如何調用decorator 基本上調用deco
        推薦度:
        導讀Python中decorator使用實例:在我以前介紹 Python 2.4 特性的Blog中已經介紹過了decorator了,不過,那時是照貓畫虎,現在再仔細描述一下它的使用。 關于decorator的詳細介紹在 Python 2.4中的What's new中已經有介紹,大家可以看一下。 如何調用decorator 基本上調用deco

        在我以前介紹 Python 2.4 特性的Blog中已經介紹過了decorator了,不過,那時是照貓畫虎,現在再仔細描述一下它的使用。

        關于decorator的詳細介紹在 Python 2.4中的What's new中已經有介紹,大家可以看一下。

        如何調用decorator

        基本上調用decorator有兩種形式

        第一種:
        代碼如下:


        @A
        def f ():

        這種形式是decorator不帶參數的寫法。最終 Python 會處理為:
        代碼如下:


        f = A(f)


        還可以擴展成:
        代碼如下:


        @A
        @B
        @C
        def f ():

        最終 Python 會處理為:
        代碼如下:


        f = A(B(C(f)))

        注:文檔上寫的是@A @B @C的形式,但實際上是不行的,要寫成多行。而且執行順序是按函數調用順序來的,先最下面的C,然后是B,然后是A。因此,如果decorator有順序話,一定要注意:先要執行的放在最下面,最后執行的放在最上面。(應該不存在這種倒序的關系)

        第二種:
        代碼如下:


        @A(args)
        def f ():

        這種形式是decorator帶參數的寫法。那么 Python 會處理為:
        代碼如下:


        def f():
        _deco = A(args)
        f = _deco(f)

        可以看出, Python 會先執行A(args)得到一個decorator函數,然后再按與第一種一樣的方式進行處理。

        decorator函數的定義

        每一個decorator都對應有相應的函數,它要對后面的函數進行處理,要么返回原來的函數對象,要么返回一個新的函數對象。請注意,decorator只用來處理函數和類方法。

        第一種:
        針對于第一種調用形式
        代碼如下:


        def A(func):
        #處理func
        #如func.attr='decorated'
        return func
        @A
        def f(args):pass

        上面是對func處理后,仍返回原函數對象。這個decorator函數的參數為要處理的函數。如果要返回一個新的函數,可以為:
        代碼如下:


        def A(func):
        def new_func(args):
        #做一些額外的工作
        return func(args) #調用原函數繼續進行處理
        return new_func
        @A
        def f(args):pass

        要注意 new_func的定義形式要與待處理的函數相同,因此還可以寫得通用一些,如:

        代碼如下:


        def A(func):
        def new_func(*args, **argkw):
        #做一些額外的工作
        return func(*args, **argkw) #調用原函數繼續進行處理
        return new_func
        @A
        def f(args):pass

        可以看出,在A中定義了新的函數,然后A返回這個新的函數。在新函數中,先處理一些事情,比如對參數進行檢查,或做一些其它的工作,然后再調原始的函數進行處理。這種模式可以看成,在調用函數前,通過使用decorator技術,可以在調用函數之前進行了一些處理。如果你想在調用函數之后進行一些處理,或者再進一步,在調用函數之后,根據函數的返回值進行一些處理可以寫成這樣:
        代碼如下:


        def A(func):
        def new_func(*args, **argkw):
        result = func(*args, **argkw) #調用原函數繼續進行處理
        if result:
        #做一些額外的工作
        return new_result
        else:
        return result
        return new_func
        @A
        def f(args):pass

        第二種:
        針對第二種調用形式

        在文檔上說,如果你的decorator在調用時使用了參數,那么你的decorator函數只會使用這些參數進行調用,因此你需要返回一個新的decorator函數,這樣就與第一種形式一致了。
        代碼如下:


        def A(arg):
        def _A(func):
        def new_func(args):
        #做一些額外的工作
        return func(args)
        return new_func
        return _A
        @A(arg)
        def f(args):pass

        可以看出A(arg)返回了一個新的 decorator _A。

        decorator的應用場景

        不過我也一直在想,到底decorator的魔力是什么?適合在哪些場合呢?是否我需要使用它呢?

        decorator的魔力就是它可以對所修飾的函數進行加工。那么這種加工是在不改變原來函數代碼的情況下進行的。有點象我知道那么一點點的AOP(面向方面編程)的想法。

        它適合的場合我能想到的列舉出下:

        1.象文檔中所說,最初是為了使調用staticmethod和classmethod這樣的方法更方便
        2.在某些函數執行前做一些工作,如web開發中,許多函數在調用前需要先檢查一下用戶是否已經登錄,然后才能調用
        3.在某此函數執行后做一些工作,如調用完畢后,根據返回狀態寫日志
        4.做參數檢查

        可能還有許多,你可以自由發揮想象

        那么我需要用它嗎?

        我想那要看你了。不過,我想在某些情況下,使用decorator可以增加程序的靈活性,減少耦合度。比如前面所說的用戶登錄檢查。的確可以寫一個通用的登錄檢查函數,然后在每個函數中進行調用。但這樣會造成函數不夠靈活,而且增加了與其它函數之間的結合程度。如果用戶登錄檢查功能有所修改,比如返回值的判斷發生了變化,有可能每個用到它的函數都要修改。而使用decorator不會造成這一問題。同時使用decorator的語法也使得代碼簡單,清晰(一但你熟悉它的語法的話)。當然你不使用它是可以的。不過,這種函數之間相互結合的方式,更符合搭積木的要求,它可以把函數功能進一步分解,使得功能足夠簡單和單一。然后再通過decorator的機制靈活的把相關的函數串成一個串,這么一想,還真是不錯。比如下面:
        代碼如下:


        @A
        @B
        def account(args):pass

        假設這是一個記帳處理函數,account只管記帳。但一個真正的記帳還有一些判斷和處理,比如:B檢查帳戶狀態,A記日志。這樣的效果其實是先檢查B、通過在A中的處理可以先執行account,然后再進行記日志的處理。象搭積木一樣很方便,改起來也容易。甚至可以把account也寫成decorator,而下面執行的函數是一個空函數。然后再通過配置文件等方法,將decorator的組合保存起來,就基本實現功能的組裝化。是不是非常理想。

        Python 帶給人的創造力真是無窮啊!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Python中decorator使用實例

        Python中decorator使用實例:在我以前介紹 Python 2.4 特性的Blog中已經介紹過了decorator了,不過,那時是照貓畫虎,現在再仔細描述一下它的使用。 關于decorator的詳細介紹在 Python 2.4中的What's new中已經有介紹,大家可以看一下。 如何調用decorator 基本上調用deco
        推薦度:
        標簽: 例子 實例 python
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 一二三四视频在线观看中文版免费 | 免费人成再在线观看网站| 日本片免费观看一区二区| 亚洲国产精品乱码一区二区| 花蝴蝶免费视频在线观看高清版 | 色一情一乱一伦一视频免费看| 午夜私人影院免费体验区| 亚洲熟妇无码一区二区三区 | 国产成人免费ā片在线观看老同学| 中文字幕亚洲专区| 成人免费区一区二区三区 | 一区二区三区免费视频观看| 亚洲人成无码网WWW| baoyu122.永久免费视频| 精品亚洲麻豆1区2区3区| 久久这里只有精品国产免费10| 亚洲中文字幕一区精品自拍| 国产成人免费ā片在线观看| 三级片免费观看久久| 亚洲国产精品VA在线观看麻豆| 99热精品在线免费观看| 亚洲精品天堂在线观看| 国产最新凸凹视频免费| 91在线视频免费观看| 亚洲最新在线视频| 四虎永久免费影院| 成人爽a毛片免费| 亚洲第一区二区快射影院| 亚洲AV无码一区二三区 | 免费91麻豆精品国产自产在线观看 | 久久亚洲AV无码西西人体| 99久9在线|免费| 亚洲AV日韩AV一区二区三曲| 国产成人精品亚洲精品| 91嫩草免费国产永久入口| 亚洲Av永久无码精品一区二区| 亚洲中文字幕无码爆乳AV| 日本XXX黄区免费看| 免费人成动漫在线播放r18| 亚洲成av人片在线观看无码不卡| 国内精品乱码卡1卡2卡3免费|