一、什么是裝飾器?
器 就是工具 可以用函式定義
裝飾 為其他事物添加功能
合到一起可以理解成是定義一個函式來裝飾其他函式,給其他函式添加額外的功能,
裝飾器 的使用滿足開放封閉原則
即對于代碼功能的拓展是開放的
對于修改源代碼是封閉的
合到一起就是不能改函式的呼叫方式,和原函式的代碼,但是要增加原函式的功能,
二、裝飾器怎么定義?
from functools import wraps
def outter(func):
@wraps(func) # 將wrapper函式偽裝成func函式的工具,除了回傳值,引數以外,包括func的內置屬性__name__,__file__等等都偽裝成一樣的,
def wrapper(*args,**kwargs): # 確保wrapper的引數,回傳值,呼叫方式都跟func一模一樣,但是可以增加一些功能
# 功能可以增加在這里
res = func(*args,**kwargs)
return res
return wrapper
==============================> 下面是函式的呼叫階段啦
func = outter(func) # 回傳值就是wrapper函式的記憶體地址,之后再加上括號就可以實作在不改變func函式的代用方式,和代碼的情況下,實作對于func功能的增加,這就是無參裝飾器的模板啦!
python給我們提供了語法糖,準許我們將func = outter(func) 這樣的陳述句,簡寫成
@outter # 在被裝飾的函式上面宣告裝飾器即可實作為函式加上功能,可以制作一些認證裝飾器,時間裝飾器,等等
def func(*args,**kwargs):
pass
==================================================》 下面是有參裝飾器啦~
from functools import wraps
def code(x):
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs): # 確保wrapper的引數,回傳值,呼叫方式都跟func一模一樣,但是可以增加一些功能
# 功能可以增加在這里
res = func(*args,**kwargs)
return res
return wrapper
return outter
==============================> 下面是函式的呼叫階段啦
受語法糖的限制,我們不能再outter函式中在增加引數了,但是如果確實還有需要傳進來的變數引數呢,我們可以通過再嵌套一層的方法給函式傳參,
outter = code(x)
無參裝飾器時語法糖是 將 func = outter(func) ---> 簡化成 ---> @outter
現在outter 就是 code(x) -----------------------------------------------> @code(x) 這就是有參的裝飾器啦~,這里傳X只是一個例子,其實可以傳不限的引數,
三、如何使用裝飾器
1.定義一個計算函式運行時間的裝飾器
from functools import wraps
import time
def timmer(func):
@wraps(func)
def wrapper(*args,**kwargs): # 確保wrapper的引數,回傳值,呼叫方式都跟func一模一樣,但是可以增加一些功能
# 功能可以增加在這里
start = time.time
res = func(*args,**kwargs)
end = time.time
print(f‘執行函式用時start-end秒’)
return res
return wrapper
2.定義一個認證功能的裝飾器
from functools import wraps
def auth(func):
@wraps(func)
def wrapper(*args,**kwargs): # 確保wrapper的引數,回傳值,呼叫方式都跟func一模一樣,但是可以增加一些功能
# 功能可以增加在這里
user_name = input('用戶名>>>:‘)
psd = input('密碼>>>:')
# 從檔案查找用戶名和密碼認證
f = open('a.txt')
for line in f:
if user_name.split().lower() in line.lower and psd in line:
res = func(*args,**kwargs)
return res
else:
print('登錄失敗')
return wrapper
四、多層裝飾器的套用
如果一個函式上面套用了很多個裝飾器
@auth
@timmer
@...
def func():
pass
需要從內向外一層層使用裝飾器功能,從函式開始,函式上面一層層剝開裝飾器,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73440.html
標籤:Python
上一篇:145二叉樹的后序遍歷
