十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
小編給大家分享一下實(shí)現(xiàn)python裝飾器的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司是一家以成都網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、seo優(yōu)化、小程序App開發(fā)等移動(dòng)開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為格柵板等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。
1、裝飾器的理解
裝飾器是將一個(gè)函數(shù)鑲嵌在另一個(gè)函數(shù)中進(jìn)行重復(fù)使用的目的,不改變其結(jié)構(gòu),增加函數(shù)的使用方式,但是不用寫過多冗余的代碼;
裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。
通常用到的功能:1.引入日志;2.函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì);3.執(zhí)行函數(shù)前預(yù)備處理;4.執(zhí)行函數(shù)后清理功能;5.權(quán)限校驗(yàn);6.緩存
2、實(shí)現(xiàn)原理與通用寫法
咱們可以從一個(gè)簡(jiǎn)單的記錄函數(shù)運(yùn)行時(shí)間的簡(jiǎn)單裝飾器,舉一反三,推導(dǎo)出一個(gè)通用的裝飾器寫法
import time def timer(func): ''' 記錄方法運(yùn)行時(shí)間的裝飾器 :param func: 方法 :return:函數(shù)對(duì)象 ''' def deco(*args, **kwargs): startTime = time.time() f = func(*args, **kwargs) endTime = time.time() msecs = (endTime - startTime) * 1000 print("time is %d ms" % msecs) return f # 如果 func 有返回值得話,需要在此return回去,否則,默認(rèn)返回值為 None,一般默認(rèn)都返回 return deco @timer def test(parameter): print("test is running!") time.sleep(1) return "Returned value" # 該函數(shù)有返回值,所以需要在 裝飾器中的 deco 方法中 寫返回值 t = test('aa') print(t)
python學(xué)習(xí)網(wǎng),免費(fèi)的python學(xué)習(xí)網(wǎng)站,歡迎在線學(xué)習(xí)!
這是一個(gè)很簡(jiǎn)單的通用的記錄時(shí)間的裝飾器,從而推導(dǎo)出一個(gè)通用的裝飾器寫法:
def func_name(func): # 自定義裝飾器函數(shù)名 def deco(*args, **kwargs): # 將所有參數(shù)原封不動(dòng)的進(jìn)行傳遞 print("在這個(gè)分割線之上寫函數(shù)運(yùn)行前的操作") # -----------分割線----------- f = func(*args, **kwargs) # -----------分割線----------- print("在這個(gè)分割線之后,return之前,寫函數(shù)運(yùn)行后的操作") return f # 如果 func 有返回值得話,需要在此return回去,否則,默認(rèn)返回值為 None,一般默認(rèn)都返回 return deco @func_name def test(parameter): # 8 print("test is running!") time.sleep(1) return "Returned value" # 該函數(shù)有返回值,所以需要在 裝飾器中的 deco 方法中 寫返回值 t = test('aa') print(t)
ok 裝飾器到此可以完事了,一般情況下都能滿足需求了,網(wǎng)上看那么多原理,有點(diǎn)兒浪費(fèi)時(shí)間,我偏向?qū)嵅傩?實(shí)在不喜歡啰嗦那么多,就是干。
當(dāng)然在開發(fā)過程中, 我們可能會(huì)遇到一些特殊情況,比如參數(shù)問題
1、給裝飾器函數(shù)代參數(shù)(通用)
2、將執(zhí)行函數(shù)的參數(shù)拆分計(jì)算等(比如:1000w的數(shù)據(jù),拆分成100份執(zhí)行等)(定制)
那就按順序來
1、寫一個(gè)代參數(shù)的裝飾器
def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print("[{level}]: enter function {func}()".format(level=level, func=func.__name__)) return func(*args, **kwargs) return inner_wrapper return wrapper @logging(level='INFO') def say(something): print("say {}!".format(something)) # 如果沒有使用@語法,等同于 # say = logging(level='INFO')(say) @logging(level='DEBUG') def do(something): print("do {}...".format(something)) if __name__ == '__main__': say('hello') do("my work")
以上是實(shí)現(xiàn)python裝飾器的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!