python中具有多重继承的MRO

python中具有多重继承的MRO,python,multiple-inheritance,method-resolution-order,Python,Multiple Inheritance,Method Resolution Order,在关于方法的文档中,python中经典类的解析顺序被描述为深度优先的从左到右搜索。我试着用这段代码来测试这一点: class A(object): def __init__(self): print "Initialized A" class B(A): def test(): print "Initialized B" class C(A): def __init__(self): print "Initialized C" cla

在关于方法的文档中,python中经典类的解析顺序被描述为深度优先的从左到右搜索。我试着用这段代码来测试这一点:

class A(object):
def __init__(self):
    print "Initialized A"

class B(A):
    def test():
        print "Initialized B"

class C(A):
    def __init__(self):
        print "Initialized C"

class D(B, C):
    def __init__(self):
        super(D, self).__init__()
        print "Initialized D"
创建对象D的实例时:

D()
我得到的结果是:

Initialized C
Initialized D

虽然我希望打印“Initialized A”,“Initialized D”,因为MRO是深度优先的,初始化首先在B中搜索,如果没有找到(这种情况下),它应该在层次结构中更深入,并在B的基类(即A)中查找函数。有人能解释一下为什么我得到的是C的init函数而不是A的函数吗?

D的MRO是:

print(D.mro())
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]
self.\uu class.\uuuu.mro()
之后的
D
中的第一个类中查找
\uuuu init\uuuuuuuuuu
方法。由于
B
没有
\uuuuu init\uuuuu
,因此它会在
C
中查找
\uuuuu init\uuuuu
方法。它查找
C.\uuuuu init\uuuuu
,因此

super(D, self).__init__()
调用
C.\uuuu init\uuuu(self)


请注意,
super
并没有试图访问
getattr(B,\uuuu init\uuuu)
。相反,它是在
B.\uu dict\uu
中查找
“\uu初始化”

您的类继承自
对象
,因此不是经典类。这是一个新型的班级。(从新样式类继承的任何类也是新样式类。)

请注意,
super
无论如何不能与经典类一起使用。您引用的“从左到右的深度优先”规则只是当您尝试访问实例上未直接定义的属性时搜索基类的顺序的属性查找规则。经典类本身不提供MRO——如果不显式引用特定的超类,就无法访问属性的“超类值”

super(D, self).__init__()