为什么当一个子class does/doesnt 继承Python 中的第三个class 时,这个class 的MRO 会发生变化?

Why does the MRO of this class change when one subclass does/doesnt inherit a third class in Python?

我试图在 Python 中更好地了解 MRO,并遇到了这个例子:

  class A:
    def process(self):
        print('A process()')


class B(A):
    pass


class C(A):
    def process(self):
        print('C process()')


class D(B,C):
    pass


obj = D()
obj.process()

打印“C process()”。我明白为什么,因为顺序是 D>B>C>A。但是,当 class C 不继承 A 时,将打印“A process()”,顺序变为 D>B>A>C。是什么导致订单转移到这里?为什么 C superclass 现在没有在 A class 之前达到?

C3 线性化算法有点深度优先,因此 A,可以从 B 到达(它在基础 class 列表中的 C 之前列出)在 C.

之前添加

理由是 D 比“C 类”更“类 B”,因此属于“B”的任何内容都应出现在“C”之前。

(为了好玩,看看当 C 仍然继承自 A 时尝试 class D(B, A, C) 会发生什么。)