本文實(shí)例為大家分享了python為被裝飾的函數(shù)保留元數(shù)據(jù)的具體代碼,供大家參考,具體內(nèi)容如下
案例:
在函數(shù)對象中保存著一些函數(shù)的元數(shù)據(jù),如:
f.__name__ 函數(shù)名
f.__doc__ 函數(shù)文檔
f.__moudle__ 函數(shù)所屬模塊名
f.__dict__ 屬性字典
f.__defaults__ 默認(rèn)參數(shù)組
……
在使用裝飾器后,在裝飾器里訪問以上屬性時(shí),我們看到的是裝飾器函數(shù)的元數(shù)據(jù)
需求:
實(shí)現(xiàn)在裝飾器函數(shù)中,保留 被裝飾函數(shù) 的元數(shù)據(jù)
如何實(shí)現(xiàn)?
通過 functools中的wraps, update_wrapper方法實(shí)現(xiàn),每個(gè)都可單獨(dú)實(shí)現(xiàn)
#!/usr/bin/python3 import timefrom functools import (wraps, update_wrapper, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES) def count_time(func): """ 給目標(biāo)函數(shù)加上計(jì)算運(yùn)行時(shí)間統(tǒng)計(jì) """ # 這個(gè)裝上器和update_wrapper一樣,默認(rèn)參數(shù)WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() # 定義result接收函數(shù)返回值,并且在裝飾函數(shù)最后返回回去 resutl = func(*args, **kwargs) print('運(yùn)行時(shí)間:', time.time()-start_time) return resutl # 其中默認(rèn)參數(shù) WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES # update_wrapper(wrapper, func) return wrapper @count_timedef add(num=100): """ 計(jì)算 0~num 累加值,默認(rèn)num=100 """ time.sleep(1) return sum([x for x in range(num+1)]) if __name__ == '__main__': print('函數(shù)名:', add.__name__) print('屬性字典:', add.__dict__) print('函數(shù)默認(rèn)參數(shù):', add.__defaults__) print('函數(shù)所在模塊:', add.__module__) print('函數(shù)文檔:', add.__doc__) # 打印兩個(gè)默認(rèn)參數(shù) print(WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES) result = add() print(result)以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選