最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年04月13日 15:04:51   投稿:goldensun  
這篇文章主要介紹了Python中用Decorator來簡化元編程的教程,來自于IBM官方開發(fā)者技術文檔,需要的朋友可以參考下

少勞多得

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

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

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

雖然 classmethod() 是內置函數(shù),但并無獨特之處;您也可以使用自己的方法轉換函數(shù)。例如:
清單 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 也可以用于正則函數(shù),采用的是與類中的方法相同的方式。令人驚奇的是,這一切是如此簡單(嚴格來說,甚至有些不必要),只需要對語法進行簡單修改,所有東西就可以工作得更好,并且使得程序的論證更加輕松。通過在方法定義的函數(shù)之前列出多個 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 其實就是一個至少具有一個參數(shù)的函數(shù) —— 程序員要負責確保 decorator 的返回內容仍然是一個有意義的函數(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 "<stdin>", line 1, in ?
TypeError: 'NoneType' object is not callable

decorator 可能會返回一個函數(shù),但這個函數(shù)與未修飾的函數(shù)之間不存在有意義的關聯(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

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

高級抽象簡介

根據(jù)我的經驗,元類應用最多的場合就是在類實例化之后對類中的方法進行修改。decorator 目前并不允許您修改類實例化本身,但是它們可以修改依附于類的方法。這并不能讓您在實例化過程中動態(tài)添加或刪除方法或類屬性,但是它讓這些方法可以在運行時根據(jù)環(huán)境的條件來變更其行為?,F(xiàn)在從技術上來說,decorator 是在運行 class 語句時應用的,對于頂級類來說,它更接近于 “編譯時” 而非 “運行時”。但是安排 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

相關文章

  • Python模擬伯努利試驗和二項分布代碼實例

    Python模擬伯努利試驗和二項分布代碼實例

    這篇文章主要介紹了Python模擬伯努利試驗和二項分布代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Python用for循環(huán)實現(xiàn)九九乘法表

    Python用for循環(huán)實現(xiàn)九九乘法表

    本文通過實例代碼給大家介紹了Python用for循環(huán)實現(xiàn)九九乘法表的方法,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • Python進程使用內存后不釋放的解決

    Python進程使用內存后不釋放的解決

    這篇文章主要介紹了Python進程使用內存后不釋放的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Pycharm遠程連接服務器并運行與調試

    Pycharm遠程連接服務器并運行與調試

    本篇文章介紹一下 Pycharm 如何配置遠程連接信息,使其能夠在本地使用服務器上的GPU等硬件資源,并在本地完成代碼的運行與調試,感興趣的可以了解一下
    2021-08-08
  • Python代碼顯得Pythonic(區(qū)別于其他語言的寫法)

    Python代碼顯得Pythonic(區(qū)別于其他語言的寫法)

    這篇文章主要介紹了Python代碼顯得Pythonic(區(qū)別于其他語言的寫法),對于字符串連接,相比于簡單的+,更pythonic的做法是盡量使用%操作符或者format函數(shù)格式化字符串,感興趣的小伙伴和小編一起進入文章了解更詳細相關知識內容吧
    2022-02-02
  • django 擴展user用戶字段inlines方式

    django 擴展user用戶字段inlines方式

    這篇文章主要介紹了django 擴展user用戶字段inlines方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python實現(xiàn)圖片壓縮代碼實例

    python實現(xiàn)圖片壓縮代碼實例

    這篇文章主要介紹了python實現(xiàn)圖片壓縮代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python重試裝飾器的簡單實現(xiàn)方法

    python重試裝飾器的簡單實現(xiàn)方法

    今天小編就為大家分享一篇python重試裝飾器的簡單實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 對pandas replace函數(shù)的使用方法小結

    對pandas replace函數(shù)的使用方法小結

    今天小編就為大家分享一篇對pandas replace函數(shù)的使用方法小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 致Python初學者 Anaconda入門使用指南完整版

    致Python初學者 Anaconda入門使用指南完整版

    相信大多數(shù) Python 的初學者們都曾為環(huán)境問題而頭疼不已,但你并不孤獨,大家都是這么折騰過來的。為了在入門時少走彎路,并且讓高漲的積極性不至于太受打擊,這里推薦使用 Anaconda 來管理你的安裝環(huán)境和各種工具包
    2018-04-04

最新評論

安吉县| 中山市| 三明市| 翁牛特旗| 西贡区| 高碑店市| 无锡市| 将乐县| 济源市| 巴林右旗| 乡宁县| 富裕县| 叙永县| 北海市| 新丰县| 商城县| 仙游县| 灵台县| 高陵县| 泸水县| 繁昌县| 新巴尔虎左旗| 中江县| 台安县| 武定县| 天门市| 井冈山市| 大同县| 徐闻县| 印江| 江达县| 长垣县| 页游| 临澧县| 顺义区| 嘉峪关市| 昌吉市| 虹口区| 龙胜| 望都县| 建瓯市|