廢話不說,先看兩端代碼:app
一、使用了@functools.wraps函數
import time import functools def timeit(func): @functools.wraps(func) def wrapper(): start = time.clock() func() end =time.clock() print "used:", end - start return wrapper @timeit def foo(): print "in foo()" foo() print "foo name", foo.__name__
運行結果(foo name 是自身foo):blog
二、未使用@functools.wraps源碼
import time #import functools def timeit(func): #@functools.wraps(func) def wrapper(): start = time.clock() func() end =time.clock() print "used:", end - start return wrapper @timeit def foo(): print "in foo()" foo() print "foo name", foo.__name__
運行結果(foo name 是wrapper):it
總結:因而可知,在編寫裝飾器時,在實現前加入@functools.wraps(func) 能夠保證裝飾器不會對被裝飾函數形成影響。import
具體原理,及更詳細的內容還有待看functool源碼去了解。原理