一. 装饰器
开闭原则: 软件设计的原则之一, 又称为开放封闭原则.
开放: 对功能扩展开放
封闭: 对修改代码封闭
装饰器: 在目标函数前或后插入一段新的代码, 不改变目标函数的代码
可以给目标函数传参, 拿到目标函数的返回值
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了, 所以执行顺序就像:
外层装饰器前 -- 内层装饰器前 -- 目标 -- 内层装饰器后 -- 外层装饰器后 -- 目标函数返回值
原文地址:https://www.cnblogs.com/guyannanfei/p/10121475.html