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

装饰器@ 面向切面的编程

参考

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

转载于:https://my.oschina.net/jiemachina/blog/205012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值