1. 程式人生 > >Python編程系列---Python中裝飾器的幾種形式及萬能裝飾器

Python編程系列---Python中裝飾器的幾種形式及萬能裝飾器

-s ont font 分析 spa def 結果 形式 one

根據函數是否傳參 是否有返回值 ,可以分析出裝飾器的四種形式:

形式一:無參無返回值

 1 def outer(func):
 2     def wrapper():
 3         print("裝飾器功能1")
 4         ret = func()
 5         print("裝飾器功能2")
  return ret
6 return wrapper 7 8 # 定義一個無參無返回值的函數 9 @outer 10 def main_func(): 11 print("hello") 12 13 main_func() #
開始執行 14 15 16 結果如下: 17 裝飾器功能1 18 hello 19 裝飾器功能2 20 21 進程已結束,退出代碼 0

總結: 裝飾器功能1 裝飾器功能2 可以根據具體項目需求需要的附加功能來寫具體代碼,可以在原功能函數之前,也可以在其之後

形式二:無參有返回值

 1 def outer(func):
 2     def wrapper():
 3         print("裝飾器功能1")
 4         ret =func()
 5         print("裝飾器功能2")
 6         return ret
 7     return wrapper
8 9 # 定義一個無參有返回值的函數 10 @outer 11 def main_func(): 12 return "hello" 13 14 15 print(main_func() 16 17 18 結果如下: 19 裝飾器功能1 20 裝飾器功能2 21 hello 22 23 進程已結束,退出代碼 0

總結: 裝飾器功能1 裝飾器功能2 可以根據具體項目需求需要的附加功能來寫具體代碼,可以在原功能函數之前,但不能在原功能函數之後

形式三:有參無返回值

 1 def outer(func):
 2     def wrapper(str1):
 3         print
("裝飾器功能1") 4 ret =func(str1) 5 print("裝飾器功能2") 6 return ret 7 return wrapper 8 9 # 定義一個有參無返回值的函數 10 @outer 11 def main_func(str1): 12 print("hello "+str1) 13 14 15
main_func("Python") 16 17 18 結果如下: 19 裝飾器功能1 20 hello Python 21 裝飾器功能2 22 23 進程已結束,退出代碼 0

總結: 裝飾器功能1 裝飾器功能2 可以根據具體項目需求需要的附加功能來寫具體代碼,可以在原功能函數之前,也可以在其之後

形式四:有參有返回值

 1 def outer(func):
 2     def wrapper(str1):
 3         print("裝飾器功能1")
 4         ret =func(str1)
 5         print("裝飾器功能2")
 6         return ret
 7     return wrapper
 8 
 9 # 定義一個有參有返回值的函數
10 @outer
11 def main_func(str1):
12     return "hello "+str1
13 
14 
15 print(main_func("Python"))
16 
17 
18 結果如下:
19 裝飾器功能1
20 裝飾器功能2
21 hello Python
22 
23 進程已結束,退出代碼 0

總結: 裝飾器功能1 裝飾器功能2 可以根據具體項目需求需要的附加功能來寫具體代碼,可以在原功能函數之前,但不能在原功能函數之後

現在用萬能裝飾器來實現以上四種形式的裝飾器:

 1 def set_func(func):
 2     def wrapper(*args,**kwargs):
 3         print("裝飾器功能1")
 4         return func(*args,**kwargs)
 5     return wrapper
 6 
 7 @set_func
 8 def show1():
 9     print("----show1----")
10 
11 @set_func
12 def show2(string,n,l):
13     return Hello + string + str(n) + :.join(l)
14 
15 show1()
16 print(show2( world , 2, [one, two, three]))
17 
18 
19 結果如下:
20 裝飾器功能1
21 ----show1---
22 裝飾器功能1
23 Hello world 2one:two:three
24 
25 進程已結束,退出代碼 0

Python編程系列---Python中裝飾器的幾種形式及萬能裝飾器