装饰器(1)
介绍
- Python的装饰器叫
Decorator
,就是对一个模块做装饰。 - 作用: 为已存在的对象添加额外功能。
- 与Java中的注解相似,就是在方法前加@XXX来对这个方法做装饰。
- 与Java中的注解相当复杂不同,Python的装饰器相当简单。
- 函数式编程
- 面向切片编程
HelloWorld
需求
def fun(i): print i
这是一个简单的方法,现在我们要在执行这个方法前后在执行一些其他代码,比如计算运行时间。
简单的方式就是:
import time def fun(i): t = time.time() print i t = time.time() - t # 计算运行时间 print '运行时间:',str(t) # 打印时间
这种方式不方便,也不能复用。
使用函数式编程
import time # 计算运行时间 def exec_time(fn, i): # fn:方法; i:方法的参数 t = time.time() fn(i) # 调用fn t = time.time() - t # 计算运行时间 print '运行时间:',str(t) # 打印时间 def fun(i): print i # 调用 exec_time(fun, i)
使用这种方式,在实际调用时,需要包裹一层exec_time
方法,虽然可以复用,使用起来但也并不灵活。
加入装饰器
下面我们就来加入修饰器
from functools import wraps # 引入装饰器需要的包 import time # 定义一个装饰器 def exec_time(fn): # 参数fn:要修饰的方法,就是我们的fun @wraps(fn) def _(i): # 修饰方法,参数i是fun传过来的参数 t = time.time() fn(i) # 执行方法 t = time.time() - t print '运行时间:',str(t) return _ # 返回修饰后方法
这样就完成了一个计算运行时间的装饰器。
@exec_time def fun(i): print i @exec_time def fun2(i): print 'fun2', i
使用起来十分方便。
解析
- 加入了
@exec_time
后的fun
方法,在调用时会自动调用相当于exec_time(fun)
的方法。 fun
方法被exec_time
装饰了,方法在开始和结束时会进行计时,并打印花费时间,这就是一个横切面,这种编程方式就是面向切面的编程
。在方法执行的过程中横向插入逻辑,在很多地方都能大量减少重复代码。
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4829345.html