<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關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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來簡化元編程的教程

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 14:32:33
        文檔

        Python中用Decorator來簡化元編程的教程

        Python中用Decorator來簡化元編程的教程:少勞多得 Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實現(xiàn) P
        推薦度:
        導(dǎo)讀Python中用Decorator來簡化元編程的教程:少勞多得 Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實現(xiàn) P

        少勞多得

        Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實現(xiàn) Python 類的創(chuàng)建,而不需要使用 “元類” 掛鉤。

        Decorator 根本上的平庸與之非常類似。Decorator 所實現(xiàn)的功能就是修改緊接 Decorator 之后定義的函數(shù)和方法。這總是可能的,但這種功能主要是由 Python 2.2 中引入的 classmethod() 和 staticmethod() 內(nèi)置函數(shù)驅(qū)動的。在舊式風(fēng)格中,您可以調(diào)用 classmethod(),如下所示:
        清單 1. 典型的 “舊式” classmethod

        class C:
         def foo(cls, y):
         print "classmethod", cls, y
         foo = classmethod(foo)
        
        

        雖然 classmethod() 是內(nèi)置函數(shù),但并無獨特之處;您也可以使用自己的方法轉(zhuǎn)換函數(shù)。例如:
        清單 2. 典型的 “舊式” 方法的轉(zhuǎn)換

        def enhanced(meth):
         def new(self, y):
         print "I am enhanced"
         return meth(self, y)
         return new
        class C:
         def bar(self, x):
         print "some method says:", x
         bar = enhanced(bar)
        
        

        decorator 所做的一切就是使您避免重復(fù)使用方法名,并且將 decorator 放在方法定義中第一處提及其名稱的地方。例如:
        清單 3. 典型的 “舊式” classmethod

        class C:
         @classmethod
         def foo(cls, y):
         print "classmethod", cls, y
         @enhanced
         def bar(self, x):
         print "some method says:", x
        
        

        decorator 也可以用于正則函數(shù),采用的是與類中的方法相同的方式。令人驚奇的是,這一切是如此簡單(嚴格來說,甚至有些不必要),只需要對語法進行簡單修改,所有東西就可以工作得更好,并且使得程序的論證更加輕松。通過在方法定義的函數(shù)之前列出多個 decorator,即可將 decorator 鏈接在一起;良好的判斷可以有助于防止將過多 decorator 鏈接在一起,不過有時候?qū)讉€ decorator 鏈接在一起是有意義的:
        清單 4. 鏈接 decorator

        @synchronized
        @logging
        def myfunc(arg1, arg2, ...):
         # ...do something
        # decorators are equivalent to ending with:
        # myfunc = synchronized(logging(myfunc))
        # Nested in that declaration order
        
        

        Decorator 只是一個語法糖,如果您過于急切,那么它就會使您搬起石頭砸了自己的腳。decorator 其實就是一個至少具有一個參數(shù)的函數(shù) —— 程序員要負責(zé)確保 decorator 的返回內(nèi)容仍然是一個有意義的函數(shù)或方法,并且實現(xiàn)了原函數(shù)為使連接有用而做的事情。例如,下面就是 decorator 兩個不正確的用法:
        清單 5. 沒有返回函數(shù)的錯誤 decorator

        >>> def spamdef(fn):
        ... print "spam, spam, spam"
        ...
        >>> @spamdef
        ... def useful(a, b):
        ... print a**2 + b**2
        ...
        spam, spam, spam
        >>> useful(3, 4)
        Traceback (most recent call last):
         File "", line 1, in ?
        TypeError: 'NoneType' object is not callable
        
        

        decorator 可能會返回一個函數(shù),但這個函數(shù)與未修飾的函數(shù)之間不存在有意義的關(guān)聯(lián):
        清單 6. 忽略傳入函數(shù)的 decorator

        >>> def spamrun(fn):
        ... def sayspam(*args):
        ... print "spam, spam, spam"
        ... return sayspam
        ...
        >>> @spamrun
        ... def useful(a, b):
        ... print a**2 + b**2
        ...
        >>> useful(3,4)
        spam, spam, spam
        
        

        最后,一個表現(xiàn)更良好的 decorator 可以在某些方面增強或修改未修飾函數(shù)的操作:
        清單 7. 修改未修飾函數(shù)行為的 decorator

        >>> def addspam(fn):
        ... def new(*args):
        ... print "spam, spam, spam"
        ... return fn(*args)
        ... return new
        ...
        >>> @addspam
        ... def useful(a, b):
        ... print a**2 + b**2
        ...
        >>> useful(3,4)
        spam, spam, spam
        25
        
        

        您可能會質(zhì)疑,useful() 到底有多么有用?addspam() 真的是那樣出色的增強 嗎?但這種機制至少符合您通常能在有用的 decorator 中看到的那種模式。

        高級抽象簡介

        根據(jù)我的經(jīng)驗,元類應(yīng)用最多的場合就是在類實例化之后對類中的方法進行修改。decorator 目前并不允許您修改類實例化本身,但是它們可以修改依附于類的方法。這并不能讓您在實例化過程中動態(tài)添加或刪除方法或類屬性,但是它讓這些方法可以在運行時根據(jù)環(huán)境的條件來變更其行為。現(xiàn)在從技術(shù)上來說,decorator 是在運行 class 語句時應(yīng)用的,對于頂級類來說,它更接近于 “編譯時” 而非 “運行時”。但是安排 decorator 的運行時決策與創(chuàng)建類工廠一樣簡單。例如:
        清單 8. 健壯但卻深度嵌套的 decorator

        def arg_sayer(what):
         def what_sayer(meth):
         def new(self, *args, **kws):
         print what
         return meth(self, *args, **kws)
         return new
         return what_sayer
        
        

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

        文檔

        Python中用Decorator來簡化元編程的教程

        Python中用Decorator來簡化元編程的教程:少勞多得 Decorator 與 Python 之前引入的元編程抽象有著某些共同之處:即使沒有這些技術(shù),您也一樣可以實現(xiàn)它們所提供的功能。正如 Michele Simionato 和我在 可愛的 Python 專欄的早期文章 中指出的那樣,即使在 Python 1.5 中,也可以實現(xiàn) P
        推薦度:
        標簽: python pytho pyt
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 91视频免费观看高清观看完整| 特级毛片爽www免费版| a级毛片免费完整视频| 亚洲精品和日本精品| 免费一级做a爰片久久毛片潮| 国产精品国产午夜免费福利看 | 久久99热精品免费观看动漫| 国产亚洲色视频在线| 91视频免费观看| 91亚洲国产在人线播放午夜| 日本三级2019在线观看免费| 色偷偷女男人的天堂亚洲网| 成年在线网站免费观看无广告| 亚洲色大18成人网站WWW在线播放| 免费无码不卡视频在线观看| 理论亚洲区美一区二区三区 | 好男人看视频免费2019中文| 亚洲日韩精品国产一区二区三区| 午夜神器成在线人成在线人免费| 日本亚洲中午字幕乱码| 国产亚洲精品资在线| 无码精品国产一区二区三区免费| 亚洲欧洲精品国产区| 精品国产免费一区二区| 又黄又大的激情视频在线观看免费视频社区在线 | 美女18毛片免费视频| 久久狠狠躁免费观看2020| 免费人成年激情视频在线观看| 成人免费视频一区二区| 久久精品国产69国产精品亚洲| 国产成人 亚洲欧洲| 国产亚洲日韩一区二区三区| 热re99久久6国产精品免费| 精品亚洲成在人线AV无码| 在线观看无码的免费网站| 一级毛片在线免费视频| 免费在线观看黄网站| 免费国产99久久久香蕉| 亚洲中文字幕无码一去台湾| 亚洲婷婷国产精品电影人久久| 最近最好最新2019中文字幕免费|