python装饰器

装饰器实际上就是函数,可以在装饰器中置入通用功能的代码来降低程序的复杂度。

功能:

--->引入日志

--->增加计时逻辑来检测性能

--->给函数加入事务的能力 

 

例子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!!!

 

可通过时间判定函数被调用的情况。

posted @ 2016-10-08 10:27  webber_liu  阅读(380)  评论(0编辑  收藏  举报