1. 程式人生 > >Python裝飾器詳解

Python裝飾器詳解

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     def
inner(*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裝飾器詳解