Python 多个装饰器运行顺序

多层装饰器修饰一个函数时,再函数运行的时候,会像一个洋葱一样,从最外层执行到里层,再从里层回调到最外层。


先定义一个装饰器

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 结束



 

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值