多层装饰器修饰一个函数时,再函数运行的时候,会像一个洋葱一样,从最外层执行到里层,再从里层回调到最外层。
先定义一个装饰器
def decorated1(func):
def inner(*args, **kwargs):
print("这是decorated1 开始")
re = func(*args, **kwargs)
print("这是decorated1 结束")
return re
return inner
定义一个测试函数
def run():
print("run test")
测试装饰器运行
@decorated1
def run():
print("run test")
if __name__ == '__main__':
run()
# 输出
# 这是decorated1 开始
# run test
# 这是decorated1 结束
再定义一个装饰器
def decorated2(func):
def inner(*args, **kwargs):
print("这是decorated2 开始")
re = func(*args, **kwargs)
print("这是decorated2 结束")
return re
return inner
测试多层装饰器修饰时,多个装饰器执行顺序
@decorated2
@decorated1
def run():
print("run test")
if __name__ == '__main__':
run()
# 输出
# 这是decorated2 开始
# 这是decorated1 开始
# run test
# 这是decorated1 结束
# 这是decorated2 结束
从这个输出来看,多层装饰器修饰时,会像洋葱一样,先执行decorated2,再执行decorated1,最后执行函数 run,再执行decorated1后续部分,最后执行decorated2。
当装饰器带有参数时,需要三层嵌套函数来实现,第一层接收装饰器需要的参数,第二层接收函数名,第三层接收函数需要的参数
def decorated_with_args(arg):
print(f"装饰器的参数为:{arg}")
def decorated1(func):
def inner(*args, **kwargs):
print("这是decorated1 开始")
re = func(*args, **kwargs)
print("这是decorated1 结束")
return re
return inner
return decorated1
@decorated_with_args(arg="test参数")
def run():
print("run test")
if __name__ == '__main__':
run()
# 输出
# 装饰器的参数为:test参数
# 这是decorated1 开始
# run test
# 这是decorated1 结束