裝飾器實際上就是函數,可以在裝飾器中置入通用功能的代碼來降低程式的複雜度。 功能: >引入日誌 >增加計時邏輯來檢測性能 >給函數加入事務的能力 例子1、簡單裝飾器 例子2、含返回值的裝飾器 例子3、複雜裝飾器 這裡是含參數的裝飾器,在裝飾器中調用before方法和after方法,完成對List方法 ...
裝飾器實際上就是函數,可以在裝飾器中置入通用功能的代碼來降低程式的複雜度。
功能:
--->引入日誌
--->增加計時邏輯來檢測性能
--->給函數加入事務的能力
例子1、簡單裝飾器
1 # -*- coding:utf-8 -*- 2 __author__ = 'webber' 3 4 def decorator(fun): 5 def wrapper(arg): 6 print "你好" 7 fun(arg) 8 print "world!!" 9 return wrapper 10 11 12 #裝飾器通過“@”符號把被裝飾的函數和裝飾函數建立起了連接,在裝飾器中,返回的是整個函數wrapper。 13 #在程式執行時,首先執行裝飾器函數,把decorator內的wrapper讀取到記憶體中,順便把Func1函數也讀到記憶體中了,然後在執行正常的順序調用 14 @decorator #這裡,可以把裝飾器看成 @decorator = decorator(Func1) 兩個函數 15 def Func1(arg): 16 print "裝飾器", arg 17 18 Func1("wee") 19 20 ''' 21 這裡,相當於 : 22 Func1= 23 def wrapper(): 24 print "你好" 25 fun() 26 print "world!!" 27 '''
例子2、含返回值的裝飾器
1 # -*- coding:utf-8 -*- 2 __author__ = 'webber' 3 4 def decorator(fun): 5 def wrapper(arg): 6 print "你好" 7 result = fun(arg) 8 print "world!!" 9 return result 10 return wrapper #這兩個return要搞清楚,上一個return返回的是函數執行過程後的返回值,而後一個返回的是整個裝飾器加函數的結果 11 12 @decorator 13 def Func1(arg): 14 print "裝飾器", arg 15 return "--------> return " 16 17 response = Func1("wee") 18 print response
例子3、複雜裝飾器
1 # -*- coding:utf-8 -*- 2 __author__ = 'webber' 3 4 def Filter(before_func, after_func): 5 def outer(main_func): 6 def wrapper(request, kargs): 7 8 before_result = before_func(request, kargs) 9 if (before_result != None): 10 return before_result 11 12 main_result = main_func(request, kargs) 13 if (main_result != None): 14 return main_result 15 16 after_result = after_func(request, kargs) 17 if (after_result != None): 18 return after_result 19 20 return wrapper 21 return outer 22 23 class AccountFilter(object): 24 def __init__(self): 25 pass 26 def Before(self, request, kargs): 27 pass 28 def After(self, request, kargs): 29 pass 30 31 @Filter(AccountFilter.Before, AccountFilter.After) 32 def List(request, kargs): 33 pass
這裡是含參數的裝飾器,在裝飾器中調用before方法和after方法,完成對List方法裝飾之前的功能步驟和裝飾之後的功能步驟,相當於上面兩個例子中的裝飾器中的fun()函數上面和下麵的兩個print的功能。
例子4、python核心編程中的例子,給一個函數通用的加了計時邏輯
1 #-*-coding:utf-8-*- 2 import time 3 4 def time_fun(func): 5 def wrapper(): 6 print '[%s] %s called' % (time.ctime(), func.__name__) 7 func() 8 #return func 9 return wrapper 10 11 @time_fun 12 def foo(): 13 print "I am doing my own work!!!" 14 15 foo() 16 time.sleep(4) 17 18 for i in range(2): 19 time.sleep(1) 20 foo()
輸出如下:
[Sat Oct 08 10:24:46 2016] foo called
I am doing my own work!!!
[Sat Oct 08 10:24:51 2016] foo called
I am doing my own work!!!
[Sat Oct 08 10:24:52 2016] foo called
I am doing my own work!!!
可通過時間判定函數被調用的情況。