【问题标题】:Why does the MRO of this class change when one subclass does/doesnt inherit a third class in Python?为什么当一个子类继承/不继承 Python 中的第三个类时,这个类的 MRO 会发生变化?
【发布时间】:2021-04-27 13:08:36
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x method-resolution-order


    【解决方案1】:

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

    理由是D 比“C-like”更“B-like”,所以任何属于“B”的部分都应该出现在“C”之前。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多