<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      翻譯:《實用的Python編程》07_04_Function_decorators

      目錄 | 上一節 (7.3 返回函數) | 下一節 (7.5 裝飾方法)

      7.4 函數裝飾器

      本節介紹裝飾器(decorator)。因為這是一個高級主題,所以我們只做簡單介紹。

      譯注:根據譯者個人的猜測,在《設計模式》(《 Design Patterns: Elements of Reusable Object-Oriented Software》)一書中寫到 decorator also known as wrapper,所以下文提到包裝器(wrapper),其實說的就是裝飾器。這里為了保持和原文一致,所以翻譯的時候沒有將“包裝器”替換為“裝飾器”。

      日志示例

      考慮這樣一個函數:

      def add(x, y):
          return x + y
      

      考慮給 add(x, y) 函數添加日志功能:

      def add(x, y):
          print('Calling add')
          return x + y
      

      也帶有日志功能的 sub(x, y)函數:

      def sub(x, y):
          print('Calling sub')
          return x - y
      

      觀察

      觀察: 這是一種重復。

      在有大量重復代碼的地方編寫程序通常很煩人。這些代碼不僅寫起來枯燥,維護起來也很麻煩。尤其是你決定更改其工作方式的時候(例如,可能是另一種類型的日志記錄)。

      記錄日志的代碼

      也許你可以創建一個添加了日志功能的函數。例如包裝器(wrapper):

      def logged(func):
          def wrapper(*args, **kwargs):
              print('Calling', func.__name__)
              return func(*args, **kwargs)
          return wrapper
      

      使用該函數:

      def add(x, y):
          return x + y
      
      logged_add = logged(add)
      

      當調用 logged 返回的函數時會發生什么?

      logged_add(3, 4)      # You see the logging message appear
      

      此示例闡明了創建所謂的包裝器函數(wrapper function) 的過程。

      包裝器是一個函數,它包裝了另一個帶有額外處理功能的函數,但在其它方面與原始函數的工作方式完全相同。

      >>> logged_add(3, 4)
      Calling add   # Extra output. Added by the wrapper
      7
      >>>
      

      注意事項:logged() 函數創建了一個包裝器,并作為結果返回。

      裝飾器

      在 Python 中,在函數中使用包裝器非常常見。因為如此普遍,所以有一個特殊的語法。

      def add(x, y):
          return x + y
      add = logged(add)
      
      # Special syntax
      @logged
      def add(x, y):
          return x + y
      

      該特殊語法執行與上面完全相同的確切步驟。裝飾器只是一種新語法,用于裝飾函數。

      說明

      對于裝飾器而言,還有許多比這里展示的更微妙的細節,例如,在類里面使用裝飾器,或者對同一個函數使用多個裝飾器。不過,這里的例子已經很好地說明了如何使用它們。一般而言,它是對出現在各種函數定義中的重復代碼的響應。裝飾器可以將重復代碼移至中心定義。

      練習

      練習 7.10:計時裝飾器

      如果你定義了一個函數,那么函數的名稱和函數所屬模塊的名稱會分別存儲到 __name____module__屬性中。示例:

      >>> def add(x,y):
           return x+y
      
      >>> add.__name__
      'add'
      >>> add.__module__
      '__main__'
      >>>
      

      請創建 timethis.py 文件,并在文件中編寫 timethis(func) 函數。timethis(func) 函數包裝一個具有額外邏輯層的函數,邏輯層打印出函數執行所需要的事件。為此,你將在函數中添加如下計時調用。

      start = time.time()
      r = func(*args,**kwargs)
      end = time.time()
      print('%s.%s: %f' % (func.__module__, func.__name__, end-start))
      

      timethis(func))裝飾器工作方式示例:

      >>> from timethis import timethis
      >>> @timethis
      def countdown(n):
              while n > 0:
                   n -= 1
      
      >>> countdown(10000000)
      __main__.countdown : 0.076562
      >>>
      

      討論:@timethis 裝飾器可以放在任何函數的前面,即你應該把裝飾器用作性能調優(performance tuning)的診斷工具。

      目錄 | 上一節 (7.3 返回函數) | 下一節 (7.5 裝飾方法)

      注:完整翻譯見 https://github.com/codists/practical-python-zh

      posted @ 2021-03-23 23:42  codists  閱讀(97)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中文字幕久久国产精品| 亚洲日本韩国欧美云霸高清| 国产精品视频全国免费观看| 亚洲精品国产一二三区| 永德县| 国产二区三区不卡免费| 久久综合给合久久狠狠狠| 国产伦子沙发午休系列资源曝光| 亚洲AV成人片在线观看| 色综合AV综合无码综合网站 | 日本边添边摸边做边爱喷水| 香港三级韩国三级日本三级| 中文字幕国产精品自拍| 天美麻花果冻视频大全英文版| 久久精品囯产精品亚洲| 日本在线视频网站www色下载| 奶头又大又白喷奶水av| 人妻少妇精品系列一区二区| 三上悠亚日韩精品二区| 国产在线精品一区二区三区不卡| 国产精品久久久国产盗摄| 国产在线啪| 日本免费一区二区三区日本| 欧洲性开放老太大| 亚洲一线二线三线品牌精华液久久久| 通许县| 麻豆人妻| 亚洲欧美人成电影在线观看| 国产精品成| 久久中文字幕日韩无码视频 | 99国产精品国产精品久久| 亚洲高请码在线精品av| 国产成人精品永久免费视频| 国产欧美亚洲精品a第一页| 江油市| 人妻av一区二区三区av免费| 国产毛片精品一区二区色| 亚洲一区二区精品另类| 99久久精品国产一区二区蜜芽| 2021精品亚洲中文字幕| 亚洲国产精品久久久久秋霞影院|