在Python中,裝飾器的本質(zhì)就是Python中的一個(gè)函數(shù),其來源自Python面向?qū)ο蟆Qb飾器是在函數(shù)調(diào)用之上的修飾。這些修飾僅是當(dāng)聲明一個(gè)函數(shù)或方法的時(shí)候,才會(huì)被應(yīng)用額外的調(diào)用。有點(diǎn)類似Java中的AOP(面向方面編程)。同時(shí)在設(shè)計(jì)模式中,還有裝飾器模式,也即是: 裝飾器模式(Decorator Pattern) 允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu) 。 原則是:不修改被修飾函數(shù)的源代碼,不修改被修飾函數(shù)的調(diào)用方式。
裝飾器的用途:
-
引入日志
-
增加計(jì)時(shí)邏輯來檢測性能
-
給函數(shù)加入事務(wù)的能力
-
權(quán)限校驗(yàn)
-
緩存
-
執(zhí)行函數(shù)前/后的預(yù)備或清理功能等
例子:
#?-*-?coding:?utf-8?-*- import?time def?deco(func):?#func?=?test1或test2 ????def?wrapper(): ????????start_time?=?time.time(); ????????func();?#就是運(yùn)行?test1()或者test2()函數(shù) ????????end_time?=?time.time(); ????????print("此模塊運(yùn)行時(shí)間為:%s"?%(end_time?-?start_time)); ????return?wrapper; def?test1(): ????time.sleep(3); ????print("函數(shù)Test1運(yùn)行結(jié)束"); def?test2(): ????time.sleep(3); ????print("函數(shù)Test2運(yùn)行結(jié)束") #在沒用使用裝飾器調(diào)用時(shí),如下調(diào)用 test1?=?deco(test1)?#返回的wrapper函數(shù)地址 test1()?#執(zhí)行的wrapper() test2?=?deco(test2) test2() #若上面函數(shù)有上百上千個(gè),都是那樣調(diào)用,都是重復(fù)的代碼調(diào)用,在Python中,使用@語法糖 #例如下面定義一個(gè)test3函數(shù) @deco??#就相等于?test3?=?deco(test3) def?test3(): ????time.sleep(3); ????print("函數(shù)Test-3運(yùn)行結(jié)束"); test3()
運(yùn)行結(jié)果如下:
函數(shù)Test1運(yùn)行結(jié)束
此模塊運(yùn)行時(shí)間為:3.000406265258789
函數(shù)Test2運(yùn)行結(jié)束
此模塊運(yùn)行時(shí)間為:3.000087261199951
函數(shù)Test-3運(yùn)行結(jié)束
此模塊運(yùn)行時(shí)間為:3.000718355178833
Process finished with exit code 0
裝飾器的語法以@開頭,接著是裝飾器函數(shù)的名字和可選的參數(shù)。緊跟著裝飾器聲明的是被修飾的函數(shù)和裝飾函數(shù)的可選參數(shù)。
例如如下:
@decorator(dec_opt_args)
def func(func_opt_args):
? ......
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
