多重继承-为什么超级不遵循MRO原则?

时间:2019-07-14 18:31:01

标签: python

示例:

class A:
    def test(self):
        print(" test of A called ")
class B(A):
    def test(self):
        print(" test of B called ")
        super().test()
class C(A):
    def test(self):
        print(" test of C called ")
        super().test()
class D(B,C):
    def test(self):
        print(" test of D called ")
        super().test()
obj=D()
obj.test()

输出为:D,B,C,A

我期望按照MRO原则获得D,B,A。要获得输出D,B,A,需要进行哪些更改?

2 个答案:

答案 0 :(得分:3)

super在超类中时遵循MRO链,而不是继承链。

因此,super().test()中的D.test调用B.test,而super().test()中的B.test调用{ {1}}-即testD中的C.test最终会调用super().test()

因此,C.test中的A.test调用了super().test()中的下一个超类'B,即test(),而不是它自己的超类{{ 1}}。

答案 1 :(得分:3)

首先,没有理由期望C被完全排除在MRO链之外,因此D B A绝对是不正确的。

D B C A的顺序而言,C3线性化算法强制执行两个约束:

  • 孩子先于父母。
  • 如果一个类从多个继承 类,它们按照在 基类。

source。)

D B C A满足两个约束。

您可以这样自己查看MRO:

>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

当所有类都调用super().test()时,它遍历了MRO链。