装饰器
开发原则
- 开放封闭原则
装饰器的作用
- 在不改变原函数的调用方式的情况下,在原函数前后增加功能
装饰器的本质
-
闭包函数
#定义一个装饰器 def wrapper(f): def inner(*args, **kwargs): ret = f(*args, **kwargs) return ret return inner @wrapper #装饰器的使用 def func(): pass #调用函数 func()
functool.wraps
-
内置装饰器,可以将修饰的函数各种功能还原
from funtools import wraps def wrapper(func): @wraps(func) def inner(*args, **kwargs) fet = func(*args, **kwargs) return fet return inner
带参数的装饰器
-
需要给装饰器再外套一层
-
个人理解:装饰器就是跳过了第一层函数,直接进入第二层函数,但是最后一层函数必须是闭包
-
500个函数案例解决方案
import time flag = Ture #定义一个判断参数 def timer_out(flag): def timer(func): def inner(*args, **kwargs) if flag: start = time.time() ret = func(*args, **kwargs) end = time.time() print(end - start) return ret else: ret = func(*args, **kwargs) return ret return inner return timer #timer = time_out(flag) @timer_out(flag) #给装饰器一个参数的时候,装饰器函数要再外套一层 def func(): pass
多个装饰器装饰一个函数
-
多个装饰器就是装饰器的套用
-
多个装饰器执行顺序是从下到上
-
多个装饰器先执行距离 被装饰的函数 近的装饰器
#定义装饰器1 def wrapper1(f): def inner1(*args, **kwargs): print('wrapper1, before f') ret = f(*args, **kwargs) print('wrapper2, after f') return ret return inner1 #定义装饰器2 def wrapper2(f): def inner2(*args, **kwargs) print('wrapper2, before f') ret = f(*args, **kwargs) print('wrapper2, after f') return ret return inner2 #调用装饰器 @wrapper2 #func=wrapper(func) --> func=wrapper(warpper(func)) 调用inner2(inner1) @wrapper1 #func = wrapper(func) 调用inner1 def func(): print('f') pass #调用函数 func() #结果 wrapper2, before f wrapper1, before f f wrapper1, after f wrapper2, after f