• python3-多装饰器的执行顺序


    【例】: 

    def dec1(func):
        print("HHHA:0====>")
        def one():
            print("HHHA:0.1====>")
            func()
            print("HHHA:0.2====>")
        return one
     
     
    def dec2(func):
        print("HHHB:0====>")
        def two():
            print("HHHB:0.1====>")
            func()
            print("HHHB:0.2====>")
        return two
     
     
    def dec3(func):
        print("HHHC:0====>")
        def three():
            print("HHHC:0.1====>")
            func()
            print("HHHC:0.2====>")
        return three
     
     
    @dec1
    @dec2
    @dec3
    def test():
        print("HHHD:0====>test")
     
     
    print("HHHH:0====>")
    test()

    输出:

    HHHC:0====>
    HHHB:0====>
    HHHA:0====>
    HHHH:0====>
    HHHA:0.1====>
    HHHB:0.1====>
    HHHC:0.1====>
    HHHD:0====>test
    HHHC:0.2====>
    HHHB:0.2====>
    HHHA:0.2====>

    请注意:以HHHH:0====>为界,咋们要分开两部分:

    第一部分:

    语法糖部分

    语法糖部分的执行顺序是从下到上(即从最靠近被装饰的函数开始)。

    所以第一部分输出:

        HHHC:0====>
        HHHB:0====>
        HHHA:0====>

    第二部分:

    加了装饰器的函数调用部分,因为语法糖部分的定义顺序是从下往上的,

    所以最后执行test() = dec1(dec2(dec3(test)))()

    所以第二部分输出:

        HHHA:0.1====>
        HHHB:0.1====>
        HHHC:0.1====>
        HHHD:0====>test
        HHHC:0.2====>
        HHHB:0.2====>
        HHHA:0.2====>

    输出语句流程图:

    {
        print("HHHA:0.1====>") //最外层
        {
            print("HHHB:0.1====>") //中间层
            {
                print("HHHC:0.1====>") //内层
                {
                    test() //被装饰者
                    {
                       print("HHHD:0====>test")
                    }
                }
                print("HHHC:0.2====>")
            }
            print("HHHB:0.2====>")
        }
        print("HHHA:0.2====>")
    }

    被装饰的函数是一个妹子,装饰器是衣服。“办事情”的时候得依次把外套、衬衣、内衣脱掉,事情办完了还要依次把内衣、衬衣、外套穿上。距离“妹子”越近的装饰器代表越贴身的衣服。

  • 相关阅读:
    docker 日常使用笔记
    docker swarm:启动多个 overlay网络出现 could not find an available IP while allocating VIP问题
    docker 容器启动失败:Could not attach to network
    fabric : orderer启动失败
    git 代码迁移
    Docker 远程访问
    Struts2标签
    BS与CS的联系与区别
    Java的引用和C++的指针de区别
    抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/Xuuuuuu/p/10244515.html
Copyright © 2020-2023  润新知