1. 程式人生 > 實用技巧 >【Python】裝飾器_詳解

【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