91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何在函數上添加包裝器

發布時間:2020-07-30 10:30:19 來源:億速云 閱讀:184 作者:小豬 欄目:開發技術

這篇文章主要講解了Python如何在函數上添加包裝器,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

問題

你想在函數上添加一個包裝器,增加額外的操作處理(比如日志、計時等)。

解決方案

如果你想使用額外的代碼包裝一個函數,可以定義一個裝飾器函數,例如:

import time
from functools import wraps

def timethis(func):
  '''
  Decorator that reports the execution time.
  '''
  @wraps(func)
  def wrapper(*args, **kwargs):
    start = time.time()
    result = func(*args, **kwargs)
    end = time.time()
    print(func.__name__, end-start)
    return result
  return wrapper

下面是使用裝飾器的例子:

>>> @timethis
... def countdown(n):
...   '''
...   Counts down
...   '''
...   while n > 0:
...     n -= 1
...
>>> countdown(100000)
countdown 0.008917808532714844
>>> countdown(10000000)
countdown 0.87188299392912
>>>

討論

一個裝飾器就是一個函數,它接受一個函數作為參數并返回一個新的函數。當你像下面這樣寫:

@timethis
def countdown(n):
  pass

跟像下面這樣寫其實效果是一樣的:

def countdown(n):
  pass
countdown = timethis(countdown)

順便說一下,內置的裝飾器比如 @staticmethod, @classmethod,@property 原理也是一樣的。例如,下面這兩個代碼片段是等價的:

class A:
  @classmethod
  def method(cls):
    pass

class B:
  # Equivalent definition of a class method
  def method(cls):
    pass
  method = classmethod(method)

在上面的 wrapper() 函數中,裝飾器內部定義了一個使用 *args 和 **kwargs 來接受任意參數的函數。在這個函數里面調用了原始函數并將其結果返回,不過你還可以添加其他額外的代碼(比如計時)。然后這個新的函數包裝器被作為結果返回來代替原始函數。

需要強調的是裝飾器并不會修改原始函數的參數簽名以及返回值。使用 *args 和 **kwargs 目的就是確保任何參數都能適用。而返回結果值基本都是調用原始函數 func(*args, **kwargs) 的返回結果,其中func就是原始函數。

剛開始學習裝飾器的時候,會使用一些簡單的例子來說明,比如上面演示的這個。不過實際場景使用時,還是有一些細節問題要注意的。比如上面使用 @wraps(func) 注解是很重要的,它能保留原始函數的元數據(下一小節會講到),新手經常會忽略這個細節。接下來的幾個小節我們會更加深入的講解裝飾器函數的細節問題,如果你想構造你自己的裝飾器函數,需要認真看一下。

看完上述內容,是不是對Python如何在函數上添加包裝器有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昭平县| 碌曲县| 炉霍县| 白沙| 石河子市| 昌吉市| 昌宁县| 县级市| 合水县| 揭西县| 肃宁县| 峨眉山市| 卓资县| 淳化县| 明溪县| 民勤县| 东阳市| 白河县| 红桥区| 乐陵市| 湖北省| 永寿县| 平塘县| 景宁| 浑源县| 获嘉县| 兴国县| 榕江县| 梧州市| 怀集县| 连江县| 天长市| 盱眙县| 河津市| 塔城市| 永福县| 南丰县| 乌兰浩特市| 桂林市| 巍山| 会同县|