废话不说,先看两端代码: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源码去了解。原理