装饰器实际上就是函数,可以在装饰器中置入通用功能的代码来降低程序的复杂度。
功能:
--->引入日志
--->增加计时逻辑来检测性能
--->给函数加入事务的能力
例子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!!!
可通过时间判定函数被调用的情况。