首先
需求來了
有如下幾個封裝好的函式供呼叫:
現在需要在每個函式執行前進行日誌記錄:
第乙個方案
修改每個函式,新增日誌記錄的**
但這樣顯然不太好,存在大量的重複**,可以將重複**封裝為乙個方法
第二個方案
這樣的確是比第乙個方案好多了,但是不符合開閉原則,即現有的**不要去修改,而在基礎的功能上進行二次開發
第三個方案
這樣的確很好,但是在呼叫的時候太麻煩了,而且函式名字也變了,以前寫好的**全部都要修改,想辦法讓函式名不變就好了
第四個方案
這樣就又好點了,在增加功能而不修改**的前提下,也保證了函式名不變
這就是裝飾器的功能了,裝飾器和上邊的**實現的功能相同,只不過用了語法糖
使用裝飾器的方案
裝飾器原理
上述**在執行@verify時,進行了如下操作:
執行verify函式 ,並將 @verify 下面的函式作為verify函式的引數
即@verify 等價於 verify(f1),其內部執行**如下:
f1 = verify(f1)
如此便為裝飾器
小小裝飾器
輸出結果:
裝飾器的常用功能
引入日誌
函式執行時間統計
執行函式前預備處理
執行函式後清理功能
許可權校驗等場景
快取裝飾器例項
1.無引數的函式
2.被裝飾的函式有引數
3.被裝飾的函式有不定長引數
4.裝飾器中的return
執行結果
如果修改裝飾器為 return func(),則執行結果:
所以,一般情況下為了讓裝飾器更通用,可以有return
5.裝飾器帶引數,在原有裝飾器的基礎上,設定外部變數
執行結果為:
可以理解為:
foo()==timefun_arg("itcast")(foo)()
python 菜鳥 Python3 教程
python 3 教程 python 的 3.0 版本,常被稱為 python 3000,或簡稱 py3k。相對於 python 的早期版本,這是乙個較大的公升級。為了不帶入過多的累贅,python 3.0 在設計的時候沒有考慮向下相容。python 介紹及安裝教程我們在python 2.x 版本的...
python3菜鳥教程pdf Python3 集合
本課一句話通俗話總結函式 新增元素 setx.add string tuple bool number void setx.update y z.void y z 為 list tuple dict setx.clear void setx.copy set 深拷貝 指向新的記憶體位址 刪除元素 s...
Python3 菜鳥教程 筆記1
菜鳥教程傳送門 環境 windows python 3.7.4 檢視python版本 python v 注意 大寫的v 例如以下是 helloworld.py 的內容 1 執行 python helloworld.py usr bin python3 被忽略,相當於注釋 2 執行 helloworl...