一. 装饰器
开闭原则: 软件设计的原则之一, 又称为开放封闭原则. 开放: 对功能扩展开放 封闭: 对修改代码封闭 装饰器: 在目标函数前或后插入一段新的代码, 不改变目标函数的代码 可以给目标函数传参, 拿到目标函数的返回值 python里面的动态代理 在不破坏目标函数和目标函数调用的基础上给函数添加新的功能 通用语法: def wrapper(fn): # fn 是目标函数 def inner(*args, **kwargs): # 聚合 给目标函数传参 """在目标函数之前进行操作""" ret = fn(*args, **kwargs) # 打散 执行目标函数, 接收目标函数的返回值"xxx" """在目标函数之后进行操作""" return ret # 返回目标函数的返回值"xxx", 保证函数正常结束 return inner # 返回inner的返回值"xxx" @wrapper # 语法糖 装饰器中特有 相当于 target_func = wrapper(target_func) def target_func() pass return "xxx" # target_func = wrapper(target_func) ret = target_func() # 执行inner, 并接收inner的返回值"xxx" print(ret) # 最终打印的是目标函数的返回值"xxx" 二. 带参数的装饰器 语法: def wrapper_out(形参): def wrapper(fn): def inner(*args, **kwargs): """在目标函数之前进行操作""" ret = fn(*args, **kwargs) """在目标函数之后进行操作""" return ret return inner return wrapper @wrapper_out(实参) def func(): pass func() 三. 多个装饰器装饰同一个函数 def wrapper1(fn): def inner(*args, **kwargs): print(111111) ret = fn(*args, **kwargs) print(222222) return ret return inner def wrapper2(fn): def inner(*args, **kwargs): print(333333) ret = fn(*args, **kwargs) print(444444) return ret return inner @wrapper1 @wrapper2 def target_func(): print("我是target_func") return "target_func" ret = target_func() print(ret) # 打印结果 111111 333333 我是target_func 444444 222222 target_func 执行顺序: 首先@wrapper2装饰起来, 然后获取到一个新函数是wrapper2中的inner, 然后执行@wrapper1, 这个时候, wrapper1装饰的就是wrapper2中的inner了, 所以执行顺序就像: 外层装饰器前 -- 内层装饰器前 -- 目标 -- 内层装饰器后 -- 外层装饰器后 -- 目标函数返回值