示例:
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,需要进行哪些更改?
答案 0 :(得分:3)
super
在超类中时遵循MRO链,而不是继承链。
因此,super().test()
中的D.test
调用B.test
,而super().test()
中的B.test
调用{ {1}}-即test
。 D
中的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链。