Python裝飾器詳解
阿新 • • 發佈:2017-06-11
def 功能 style out return 裝飾器 代碼 方法 情況
首先是不使用裝飾器的情況,又需要在不修改原函數的情況話修改函數結果
1 def outer(func): 2 def inner(): 3 print("Hello") 4 ret = func() 5 print("World") 6 return ret 7 return inner 8 9 def Fun(): 10 print("Fun") 11 12 outer(Fun)() 13 14 結果: 15 Hello 16 Fun 17 World
在不使用裝飾器的情況下,雖然結果一樣,但是調用者需要修改調用方式,如果該函數是提供給很多人使用的,則很不方便
接下來是使用裝飾器的方法
1 def outer(func): 2 def inner(): 3 print("Hello") 4 ret = func() 5 print("World") 6 return ret 7 return inner 8 9 @outer 10 def Fun(): 11 print("Fun") 12 13 Fun()
結果相同,但是函數調用者不需要修改調用方式
函數帶有參數的情況
1 def outer(func): 2 def inner(x, y):3 print("Hello") 4 ret = func(x, y) 5 print("World") 6 return ret 7 return inner 8 9 @outer 10 def Fun(x, y): 11 print(x + y) 12 13 Fun(1, 2) 14 15 結果: 16 Hello 17 3 18 World
但是如果該裝飾器需要裝飾多個函數,並且函數中的參數個數不同,則可以采用下列方法解決
1 def outer(func): 2 definner(*args, **kwargs): 3 print("Hello") 4 ret = func(*args, **kwargs) 5 print("World") 6 return ret 7 return inner 8 9 @outer 10 def Fun1(x, y): 11 print(x + y) 12 13 @outer 14 def Fun2(x, y, z): 15 print(x + y + z) 16 17 Fun1(1, 2) 18 Fun2(2, 3, 4)
在這種情況下,多個不同函數也可以使用同一個裝飾器,並且python內部自動分配參數。
多個裝飾器同時裝飾一個函數
之前我們的裝飾器是在函數調用前後分別輸出 <q>Hello World</q> ,現在我們添加一個新的需求,在輸出Hello之前輸出Python用過重新寫另外一個裝飾器也可以實現,但是比較麻煩,不符合編碼的代碼重用規則,在這裏我們使用另外一個裝飾器,只需要將新增的功能添加到裝飾器即可。
1 def outer(func): 2 def inner(*args, **kwargs): 3 print("Hello") 4 ret = func(*args, **kwargs) 5 print("World") 6 return ret 7 return inner 8 9 def outer2(func): 10 def inner(*args, **kwargs): 11 print("python") 12 ret = func(*args, **kwargs) 13 return ret 14 return inner 15 16 #使用兩個裝飾器 17 @outer2 18 @outer 19 def Fun(x, y): 20 print(x + y) 21 22 Fun(1, 2)
Python裝飾器詳解