调用构造函数时python中多重和多级继承中的方法顺序解析

调用构造函数时python中多重和多级继承中的方法顺序解析,python,class,oop,constructor,multiple-inheritance,Python,Class,Oop,Constructor,Multiple Inheritance,注意事项: 在打印类D的MRO时获得正确的继承顺序,但没有获得类C的构造函数调用 问题:为什么不在下面给定代码中的构造函数之后打印C构造函数 class A(object): def __init__(self): print("A Constructor") class B(A): def __init__(self): print("B Constructor") super(B, self).__init__() cla

注意事项:

  • 在打印类D的MRO时获得正确的继承顺序,但没有获得类C的构造函数调用
  • 问题:为什么不在下面给定代码中的构造函数之后打印C构造函数

    class A(object):
    
        def __init__(self):
            print("A Constructor")
    
    class B(A):
        def __init__(self):
            print("B Constructor")
            super(B, self).__init__()
    
    class C():
        def __init__(self):
            print("C Constructor")
            super().__init__()
    
       def method(self):
            print("C method")  
    
    
    class D(B, C):
        def __init__(self):
            print("D Constructor")
            super(D, self).__init__()
            super().method()
    d = D()
    print(D.__mro__)
    
    输出:
    1 C的init从未被称为cos

    2 super在D上开始搜索,在D->B->A->上搜索,在->对象上搜索结束

    3在这种情况下,搜索开始D->B->A->object,并完成第一个super

    对象或类型确定要搜索的方法解析顺序。搜索从类型后面的类开始

    如果对象或类型的mro为D->B->C->A->object且类型的值为B,则super()搜索C->A->object

    4然后,second super()允许您从继承的子类访问超类中的方法

    5在本例中,您可以访问C.method,并在打印第一个super的构造函数后打印oue“C method”

    super()单独返回超类的临时对象,然后允许您调用该超类的方法
    允许您以最少的代码更改交换超类。

    如果您想了解MRO在Python中的工作方式,我建议您看看这个

    在Python2.3及更高版本中,Python对MRO使用C3线性化算法


    祝你好运。

    我无法解释,所以我不发布答案,但解决方法是将:
    D类(B,C):
    更改为
    D类(C,B):
    @U9 Forward:是的,在从D类(B,C)更改为D类(C,B)时能够打印所有必需的值。但是我想知道为什么上面的代码没有给出预期的答案。是的,这就是为什么我没有回答可能重复的@blhsing在打印D时得到正确的顺序。但是没有得到C类的构造函数调用