python 装饰器@ 面向切面的编程

装饰器@ 面向切面的编程

参考html

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这个方法;咱们能够这样设计;python

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);app

刚才我说了一个从代码上看来,foo仍是foo, 其实从上面timeit(func)的实现来看,由于timeit返回的是一个wrapper方法,因此,foo本质上已经变成了wrapper了,那么怎么避免这点呢?因此python的提供了一个functools.wraps的装饰器;this

如重新定义timeit()设计

def timeit(func):
	@functools.wraps(func)
	def wrapper():
		start = time.clock()
		func()
		end = time.clock()
		print 'used time', end-start
	
return wrapper
相关文章
相关标签/搜索