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
相關文章
相關標籤/搜索