欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1608 0

少勞多得

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

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

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


          

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

            
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 所做的一切就是使您避免重復使用方法名,并且將 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 也可以用于正則函數,采用的是與類中的方法相同的方式。令人驚奇的是,這一切是如此簡單(嚴格來說,甚至有些不必要),只需要對語法進行簡單修改,所有東西就可以工作得更好,并且使得程序的論證更加輕松。通過在方法定義的函數之前列出多個 decorator,即可將 decorator 鏈接在一起;良好的判斷可以有助于防止將過多 decorator 鏈接在一起,不過有時候將幾個 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 其實就是一個至少具有一個參數的函數 ―― 程序員要負責確保 decorator 的返回內容仍然是一個有意義的函數或方法,并且實現了原函數為使連接有用而做的事情。例如,下面就是 decorator 兩個不正確的用法:
清單 5. 沒有返回函數的錯誤 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 可能會返回一個函數,但這個函數與未修飾的函數之間不存在有意義的關聯:
清單 6. 忽略傳入函數的 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


          

最后,一個表現更良好的 decorator 可以在某些方面增強或修改未修飾函數的操作:
清單 7. 修改未修飾函數行為的 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


          

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

高級抽象簡介

根據我的經驗,元類應用最多的場合就是在類實例化之后對類中的方法進行修改。decorator 目前并不允許您修改類實例化本身,但是它們可以修改依附于類的方法。這并不能讓您在實例化過程中動態添加或刪除方法或類屬性,但是它讓這些方法可以在運行時根據環境的條件來變更其行為。現在從技術上來說,decorator 是在運行 class 語句時應用的,對于頂級類來說,它更接近于 “編譯時” 而非 “運行時”。但是安排 decorator 的運行時決策與創建類工廠一樣簡單。例如:
清單 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


          


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: gvg668| 香蕉福利久久福利久久香蕉 | 精品一区二区久久久久久久网站 | 久久男人的天堂 | 亚洲欧美精品综合中文字幕 | 欧美日韩视频在线第一区 | 五月天丁香久久 | 丝袜美腿视频一区二区三区 | 全黄性性激高免费视频 | A片A三女人久久7777 | 嫩草影院永久在线播放 | 2019国产精品| 锵锵锵锵锵锵锵锵锵好大好湿软件 | 国产精品啪一品二区三区粉嫩 | 亚洲看看| 五月中文字幕 | 国产精品久久久久久久久久久久 | 精品欧美一区视频在线观看 | 成人福利在线视频 | 精品特级毛片 | 久久99精品久久 | 深夜影院老司机69影院 | 亚洲欧美日韩精品久久亚洲区 | 五月婷婷丁香 | 国产精品久久久久久久午夜 | 亚洲精品视频一区二区三区 | 色爱av| 欧美日韩亚洲在线 | 色www精品视频在线观看 | 亚洲香蕉毛片久久网站老妇人 | 99久久精品免费看国产一区二区 | 91福利小视频 | 欧美人人干 | 亚洲国产免费 | 奇米影视在线 | 成人天堂资源www在线 | 国产日韩视频 | 成人国产精品色哟哟 | 成人午夜网 | 欧美性一区二区三区 | 美女视频黄在线观看 |