装饰器@ 面向切面的编程
import time
def foo():
print 'this is foo'
def timeit(func):
start = time.clock()
func()
end = time.clock()
print 'used time : ', (end-start)
timeit(foo)
本来可以这样使用的,但是如果是这样使用的话,语义会出现问题;所以为了让我们感觉还是在用foo这个方法;我们可以这样设计;
def timeit(func):
def wrapper():
start= time.clock()
func()
end = time.clock()
print 'used time', end-start
return wrapper
foo = timeit(foo)# 这个还没有执行 xxxxx行
foo()# 才刚开始执行 yyyy行
在python 中为了简化xxxx行就有一种叫语法糖(装饰器@)
的东西;可以直接在foo的方法定义前使用;
@timeit
def foo():
......
以上代码就是装饰模式的设计思想
,就是在原来的东西上装饰了一些东西,结果本质上还是那个东西; 比如:一个白色的杯子,你只是给它刷了一层漆, 那么这个杯子还是杯子,而不是变成其他物品;所以,foo 在代码书写
看来还是 foo, 而不是变成timeit(foo);
刚才我说了一个从代码上
看来,foo还是foo, 其实从上面timeit(func)的实现来看,因为timeit返回的是一个wrapper方法,所以,foo本质上已经变成了wrapper了,那么怎么避免这点呢?所以python的提供了一个functools.wraps的装饰器;
如从新定义timeit()
def timeit(func):
@functools.wraps(func)
def wrapper():
start = time.clock()
func()
end = time.clock()
print 'used time', end-start
return wrapper