mro、super学习

mro了解

    def super(cls, inst):
        """
        :param cls: 类对象
        :param inst: 实例
        :return: 
        """
        mro = inst.__class__.mro()
        return mro[mro.index(cls) + 1]

其中,cls 代表类,inst 代表实例,上面的代码做了两件事:

  1. 获取 inst 的 MRO 列表
  2. 查找 cls 在当前 MRO 列表中的 index, 并返回它的下一个类,即 mro[index + 1]
    当使用 super(cls, inst) 时,Python 会在 inst 的 MRO 列表上搜索 cls 的下一个类。

super学习

  1. 代码示例

    class Base:
        def __init__(self):
            print("enter Base")
            print("leave Base")
    
    
    class A(Base):
        def __init__(self):
            print("enter A")
            super(A,self).__init__()
            print("leave A")
    
    
    class B(Base):
        def __init__(self):
            print("enter B")
            super(B,self).__init__()
            print("leave B")
    
    class C(A,B):
        def __init__(self):
            print("enter C")
            super(C,self).__init__()
            print("leave C")
    
    
    print(C.mro())
    c=C()
    
  2. 运行结果

    [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
    enter C
    enter A
    enter B
    enter Base
    leave Base
    leave B
    leave A
    leave C
    
  3. 分析
    C对象初始化时调用super,在mro列表中进入A对象初始化,此时super(A,self).__init__()中self为C实例c,参考上述mro实现,返回B类,进行B对象的初始化,再进行Base初始化

思考

  1. 代码示例1

        class Base1:
            def __init__(self):
                print("enter Base1")
                # super().__init__()
                print("leave Base1")
    
    
        class Base2:
            def __init__(self):
                print("enter Base2")
                print("leave Base2")
    
    
        class A(Base1):
            def __init__(self):
                print("enter A")
                super().__init__()
                print("leave A")
    
    
        class B(Base2):
            def __init__(self):
                print("enter B")
                super().__init__()
                print("leave B")
    
    
        class C(A, B):
            def __init__(self):
                print("enter C")
                super().__init__()
                print("leave C")
    
    
        print(C.mro())
        c = C()
    
  2. 运行结果

    [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.Base1'>, <class '__main__.B'>, <class '__main__.Base2'>, <class 'object'>]
    enter C
    enter A
    enter Base1
    leave Base1
    leave A
    leave C
    
  3. 此处mro包含Base1、Base2,但未初始化Base2。因为在初始化Base1时,并未存在super即不会寻找mro列表中下一项。取消Base1super注释后,可按照mro初始化

  4. 修改后运行结果

    [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.Base1'>, <class '__main__.B'>, <class '__main__.Base2'>, <class 'object'>]
    enter C
    enter A
    enter Base1
    enter B
    enter Base2
    leave Base2
    leave B
    leave Base1
    leave A
    leave C
    

super多继承问题

  1. 优雅的多继承尝试
    class AAA:
        def __init__(self, a, b, c):
            super(AAA, self).__init__(b, c)
            self.a = a
    
    
    class BBB:
        def __init__(self, b, c):
            super(BBB, self).__init__(c)
            self.b = b
    
    
    class CCC:
        def __init__(self, c):
            self.c = c
    
    
    class Test(AAA, BBB, CCC):
        def __init__(self, a, b, c):
            super(Test, self).__init__(a, b, c)
    
    
    print(Test.mro())
    test = Test(1, 2, 3)
    print(test.__dict__)
    
    运行结果
    [<class '__main__.Test'>, <class '__main__.AAA'>, <class '__main__.BBB'>, <class '__main__.CCC'>, <class 'object'>]
    {'c': 3, 'b': 2, 'a': 1}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值