參考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