python进阶——装饰器系列之装饰器功能与结构

花间影清欢课程 2024-03-29 23:40:30
1. 装饰器的主要功能和装饰器的固定结构在不改变函数调用方式的基础上在函数的前、后添加功能。2. 装饰器的固定格式2.1 装饰器的固定格式def timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner2.2 wraps版装饰器固定格式from functools import wrapsdef deco(func): @wraps(func) #加在最内层函数正上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper3. 带参数的装饰器假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做? 一个一个地取消掉? 没日没夜忙活3天。。。 过两天你领导想通了,再让你加上。。。 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer# False时不装饰,True时装饰@outer(False)def func(): print(111)func()4. 多个装饰器装饰同一个函数def wrapper1(func): def inner1(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner1def wrapper2(func): def inner2(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner2@wrapper2@wrapper1 # 从下往上执行def func(): print('in f')func()当多个装饰器装饰同一个函数时,装饰器的运行顺序是从下到上的,比如上面这个f函数,装饰器运行的顺序应当是wrapper1 ->wrapper2 5. 分析函数func的运行过程传入wrapper1 的方法是func传入wrapper2的方法是运行wrapper1返回的inner1执行函数func执行wrapper1 后续代码执行wrapper2后续代码
0 阅读:0