在Python中,裝飾器的本質就是Python中的一個函數,其來源自Python面向對象。裝飾器是在函數調用之上的修飾。這些修飾僅是當聲明一個函數或方法的時候,才會被應用額外的調用。有點類似Java中的AOP(面向方面編程)。同時在設計模式中,還有裝飾器模式,也即是: 裝飾器模式(Decorator Pattern) 允許向一個現有的對象添加新的功能,同時又不改變其結構 。 原則是:不修改被修飾函數的源代碼,不修改被修飾函數的調用方式。
裝飾器的用途:
-
引入日志
-
增加計時邏輯來檢測性能
-
給函數加入事務的能力
-
權限校驗
-
緩存
-
執行函數前/后的預備或清理功能等
例子:
#?-*-?coding:?utf-8?-*-
import?time
def?deco(func):?#func?=?test1或test2
????def?wrapper():
????????start_time?=?time.time();
????????func();?#就是運行?test1()或者test2()函數
????????end_time?=?time.time();
????????print("此模塊運行時間為:%s"?%(end_time?-?start_time));
????return?wrapper;
def?test1():
????time.sleep(3);
????print("函數Test1運行結束");
def?test2():
????time.sleep(3);
????print("函數Test2運行結束")
#在沒用使用裝飾器調用時,如下調用
test1?=?deco(test1)?#返回的wrapper函數地址
test1()?#執行的wrapper()
test2?=?deco(test2)
test2()
#若上面函數有上百上千個,都是那樣調用,都是重復的代碼調用,在Python中,使用@語法糖
#例如下面定義一個test3函數
@deco??#就相等于?test3?=?deco(test3)
def?test3():
????time.sleep(3);
????print("函數Test-3運行結束");
test3()
運行結果如下:
函數Test1運行結束
此模塊運行時間為:3.000406265258789
函數Test2運行結束
此模塊運行時間為:3.000087261199951
函數Test-3運行結束
此模塊運行時間為:3.000718355178833
Process finished with exit code 0
裝飾器的語法以@開頭,接著是裝飾器函數的名字和可選的參數。緊跟著裝飾器聲明的是被修飾的函數和裝飾函數的可選參數。
例如如下:
@decorator(dec_opt_args)
def func(func_opt_args):
? ......
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

