看过800遍装饰器,每次都以为自己学明白了,真正用的时候却很懵逼。
如何一劳永逸的深入理解装饰器,这是一个值得思考的问题。装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
完整的装饰器示例
import timedef timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner@timer #==> func1 = timer(func1)def func1(a,b): print('in func1')@timer #==> func2 = timer(func2)def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over'func1('aaaaaa','bbbbbb')print(func2('aaaaaa'))
解决查看函数信息的方法失效的问题
from functools import wrapsdef deco(func): @wraps(func) #加在最内层函数正上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper@decodef index(): '''哈哈哈哈''' print('from index')print(index.__doc__)print(index.__name__)