首页 > 解决方案 > 为什么当一个子类继承/不继承 Python 中的第三个类时,这个类的 MRO 会发生变化?

问题描述

我试图更好地理解 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 进程()”。我明白为什么,因为顺序是 D>B>C>A。但是,当类 C 不继承 A 时,会打印“A process()”并且顺序变为 D>B>A>C。是什么导致订单在这里转移?为什么现在没有在 A 类之前达到 C 超类?

标签: pythonpython-3.xmethod-resolution-order

解决方案


C3 线性化算法在某种程度上是深度优先的,因此在 之前添加了A可从B(之前C在基类列表中列出)C

基本原理是它D更像“B-like”而不是“C-like”,所以任何属于“B”的部分都应该出现在“C”之前。

(为了好玩,看看如果你尝试类似class D(B, A, C)whenC仍然继承自 的东西会发生什么A。)


推荐阅读