python之裝飾器(函數)
- 2020 年 1 月 20 日
- 筆記
1. 裝飾器 遵循的原則:
開閉原則: 對功能的擴展開放 對程式碼的修改是封閉
# 通用裝飾器寫法 # 存在的意義: 在不破壞原有函數和原有函數調用的基礎上,給函數添加新的功能. def wrapper(fn): # fn是目標函數 def inner(*args, **kwargs): # 為了目標函數的傳參 '''在執行目標函數之前''' ret = fn(*args, **kwargs) # 調用目標函數, ret是目標函數的返回值 '''在執行目標函數之前''' return ret # 把目標函數返回值返回, 保證函數正常的結束 return inner @wrapper # target_func = wrapper(target_func) def target_func(): pass target_func() # 此時執行的是inner
2. 帶參數的裝飾器
def wrapper_out(flag): # 裝飾器本身的參數 def wrapper(fn): # 目標函數 def inner(*args, **kwargs): # 目標函數需要的參數 if flag == True: # 判斷是否需要裝飾 print('問問老闆,行情怎麼樣啊?') ret = fn(*args, **kwargs) print('騙我!!') return ret else: # 不需要裝飾 ret = fn(*args, **kwargs) return ret return inner return wrapper @wrapper_out(True) # 先執行wrapper_out(True) 返回一個裝飾器, 再和@拼接 -> @裝飾器 # @wrapper_out(False) # 走,開團 def yue(): # 被wrapper裝飾 print('走,開團') yue()
3. 同一個函數被多個裝飾器裝飾
@wrapper1 @wrapper2 @wrapper3 def func(): pass # 1 2 3 func 3 2 1