函数被装饰器装饰后会失去原本的属性和元数据,为了保存原因的元数据,使用functools下的wraps下的装饰器
未使用装饰器装饰时:
def mydecorator(fun): def wrap(*args): print 'I am mydecorator' fun(*args) return wrap() def example(): print 'sdsdsd' print example.__name__ print example.__doc__
运行结果:
example
None
使用装饰器后
def mydecorator(fun): def wrap(*args): print 'I am mydecorator' fun(*args) return wrap() @mydecorator def example(): print 'sdsdsd' print example.__name__ print example.__doc__
运行结果:name的属性为装饰器的属性
wrap
None
加入装饰器后:
from functools import update_wrapper, wraps, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES def mydecorator(func): @wraps(func) #使用装饰器,同样有assigned=(),updated=()有默认值WRAPPER_ASSIGNMENTS和 WRAPPER_UPDATES def wrap(*args, **kwargs): print 'I am mydecorator' func(*args, **kwargs) '''第一种,保持原来的元组数据''' #update_wrapper(wrap, func,assigned=(),updated=()) 这两个assigned=(),updated=()有默认值WRAPPER_ASSIGNMENTS和 WRAPPER_UPDATES return wrap @mydecorator def example(): print 'sdsdsd' print example.__name__ print example.__doc__
print WRAPPER_ASSIGNMENTS
print WRAPPER_UPDATES
结果:
example
None
('__module__', '__name__', '__doc__')
('__dict__',)