Python 在函數(shù)上添加包裝器
問(wèn)題
你想在函數(shù)上添加一個(gè)包裝器,增加額外的操作處理(比如日志、計(jì)時(shí)等)。
解決方案
如果你想使用額外的代碼包裝一個(gè)函數(shù),可以定義一個(gè)裝飾器函數(shù),例如:
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 >>>
討論
一個(gè)裝飾器就是一個(gè)函數(shù),它接受一個(gè)函數(shù)作為參數(shù)并返回一個(gè)新的函數(shù)。當(dāng)你像下面這樣寫(xiě):
@timethis def countdown(n): pass
跟像下面這樣寫(xiě)其實(shí)效果是一樣的:
def countdown(n): pass countdown = timethis(countdown)
順便說(shuō)一下,內(nèi)置的裝飾器比如 @staticmethod, @classmethod,@property 原理也是一樣的。例如,下面這兩個(gè)代碼片段是等價(jià)的:
class A: @classmethod def method(cls): pass class B: # Equivalent definition of a class method def method(cls): pass method = classmethod(method)
在上面的 wrapper() 函數(shù)中,裝飾器內(nèi)部定義了一個(gè)使用 *args 和 **kwargs 來(lái)接受任意參數(shù)的函數(shù)。在這個(gè)函數(shù)里面調(diào)用了原始函數(shù)并將其結(jié)果返回,不過(guò)你還可以添加其他額外的代碼(比如計(jì)時(shí))。然后這個(gè)新的函數(shù)包裝器被作為結(jié)果返回來(lái)代替原始函數(shù)。
需要強(qiáng)調(diào)的是裝飾器并不會(huì)修改原始函數(shù)的參數(shù)簽名以及返回值。使用 *args 和 **kwargs 目的就是確保任何參數(shù)都能適用。而返回結(jié)果值基本都是調(diào)用原始函數(shù) func(*args, **kwargs) 的返回結(jié)果,其中func就是原始函數(shù)。
剛開(kāi)始學(xué)習(xí)裝飾器的時(shí)候,會(huì)使用一些簡(jiǎn)單的例子來(lái)說(shuō)明,比如上面演示的這個(gè)。不過(guò)實(shí)際場(chǎng)景使用時(shí),還是有一些細(xì)節(jié)問(wèn)題要注意的。比如上面使用 @wraps(func) 注解是很重要的,它能保留原始函數(shù)的元數(shù)據(jù)(下一小節(jié)會(huì)講到),新手經(jīng)常會(huì)忽略這個(gè)細(xì)節(jié)。接下來(lái)的幾個(gè)小節(jié)我們會(huì)更加深入的講解裝飾器函數(shù)的細(xì)節(jié)問(wèn)題,如果你想構(gòu)造你自己的裝飾器函數(shù),需要認(rèn)真看一下。
以上就是Python 在函數(shù)上添加包裝器的詳細(xì)內(nèi)容,更多關(guān)于Python 添加包裝器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Bagging算法的原理及Python實(shí)現(xiàn)
Bagging算法(Bootstrap aggregating,引導(dǎo)聚集算法),又稱裝袋算法,是機(jī)器學(xué)習(xí)領(lǐng)域的一種團(tuán)體學(xué)習(xí)算法。最初由Leo Breiman于1996年提出。Bagging算法可與其他分類、回歸算法結(jié)合,提高其準(zhǔn)確率、穩(wěn)定性的同時(shí),通過(guò)降低結(jié)果的方差,避免過(guò)擬合的發(fā)生2021-06-06Python語(yǔ)音合成之第三方庫(kù)gTTs/pyttsx3/speech橫評(píng)(內(nèi)附使用方法)
Python是一種非常強(qiáng)大的腳本語(yǔ)言,可以用來(lái)實(shí)現(xiàn)各種復(fù)雜的應(yīng)用,其中之一就是文本轉(zhuǎn)語(yǔ)音,即把文字轉(zhuǎn)換成聲音來(lái)發(fā)出,下面這篇文章主要給大家介紹了關(guān)于Python語(yǔ)音合成之第三方庫(kù)gTTs/pyttsx3/speech橫評(píng)的相關(guān)資料,文中還介紹了詳細(xì)的使用方法,需要的朋友可以參考下2023-05-05Python 使用 Pillow 模塊給圖片添加文字水印的方法
這篇文章主要介紹了Python 使用 Pillow 模塊給圖片添加文字水印的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08python判斷變量是否為int、字符串、列表、元組、字典的方法詳解
這篇文章主要介紹了python判斷變量是否為int、字符串、列表、元組、字典的方法詳解,需要的朋友可以參考下2020-02-02如何利用python實(shí)現(xiàn)圖片轉(zhuǎn)化字符畫(huà)
這篇文章主要介紹了如何利用python實(shí)現(xiàn)圖片轉(zhuǎn)化字符畫(huà),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06