【Python】裝飾器_詳解
裝飾器:
定義:本質是函式(裝飾其他函式),意思就是為其他函式新增附加功能。
原則:1.不能修改被裝飾函式的原始碼
2.不能修改被裝飾函式的呼叫方式
實現裝飾器,要具備的知識:
1.函式即變數
2.高階函式(滿足下面一個條件就是高階函式)
a:把一個函式名當做實參傳遞給另外一個函式
b:返回值中包含函式名 (不修改函式的呼叫方式)
3.巢狀函式
高階函式+巢狀函式==》裝飾器
小蝦這就來舉一個比較常見的例子:
def decorator (func):def inner(): # 驗證1 # 驗證2 # 驗證3 return func() return inner @decorator =》f1=decorator(f1) def f1(): print ('f1')
注意:@函式名是python的一種語法糖。
如上例@decorator,內部會執行一下操作:執行decorator函式,並將 @decorator 下面的函式作為decorator函式的引數,即:@decorator 等價於 decorator(f1)所以,內部就會去執行:
def inner:#驗證 return f1() # func是引數,此時 func 等於 f1 return inner # 返回的 inner,inner代表的是函式,非執行函式
# 其實就是將原來的 f1 函式塞進另外一個函式中
將執行完的decorator 函式返回值
賦值
給@
decorator
下面的函式的函式名
decorator函式的返回值是:
def inner: #驗證 return 原來f1() # 此處的 f1 表示原來的f1函式 然後,將此返回值再重新賦值給 f1,即:新f1 = def inner:#驗證 return 原來f1()
所以,以後想要執行 f1 函式時,就會執行 新f1 函式,在 新f1 函式內部先執行驗證,再執行原來的f1函式,然後將 原來f1 函式的返回值 。
上面提到的裝飾函式沒有引數:那麼問題來了,如果其含有引數呢?又該如何呢?
def w1(func): def inner(*args,**kwargs): # 驗證1 # 驗證2 # 驗證3 return func(*args,**kwargs) return inner @w1 def f1(): print("f1") def f2(arg1,arg2,arg3): print ("f2")
上面程式碼中通過在裝飾器中的引數中使用(*args,**kwarge)(*args是非關鍵字引數,用於元組,**kw是關鍵字引數,用於字典),就可以裝飾具有處理n個引數的函式的裝飾器。(如果有什麼不太明白的,可以檢視這篇部落格 https://blog.csdn.net/qq_33432841/article/details/107768100)