裝飾器python3菜鳥教程 Python 裝飾器

2021-10-11 22:05:25 字數 987 閱讀 6955

首先

需求來了

有如下幾個封裝好的函式供呼叫:

現在需要在每個函式執行前進行日誌記錄:

第乙個方案

修改每個函式,新增日誌記錄的**

但這樣顯然不太好,存在大量的重複**,可以將重複**封裝為乙個方法

第二個方案

這樣的確是比第乙個方案好多了,但是不符合開閉原則,即現有的**不要去修改,而在基礎的功能上進行二次開發

第三個方案

這樣的確很好,但是在呼叫的時候太麻煩了,而且函式名字也變了,以前寫好的**全部都要修改,想辦法讓函式名不變就好了

第四個方案

這樣就又好點了,在增加功能而不修改**的前提下,也保證了函式名不變

這就是裝飾器的功能了,裝飾器和上邊的**實現的功能相同,只不過用了語法糖

使用裝飾器的方案

裝飾器原理

上述**在執行@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...