不幸的是,如果不知道D的方法解析顺序(MRO),就无法在D中调用super()来获取两个基类.
但是MRO是强大的概念.在第二种情况下,
class D(C,A):
...
(MRO)是
>>> D.mro()
[, , , , ]
因为调用super()会带你到MRO中的下一个类,就像Pieters先生所说的那样,并且你希望打印语句按照A,B,C的顺序排列,然后是D,只需要输入super().foo( )首先在foo()的每个定义中打印(…)秒.唯一的例外是不要在类A中放置super().foo(),因为foo()没有在object中定义.
解
#! /usr/bin/env python3
class A(object):
def __init__(self):
super().__init__()
def foo(self):
print("The")
class B(object):
def __init__(self):
super().__init__()
def foo(self):
super().foo() # Inserted
print("world")
class C(B):
def __init__(self):
super().__init__()
def foo(self):
super().foo()
print("is")
class D(C,A): # Correct ordering
def __init__(self):
super().__init__()
def foo(self):
super().foo()
print("nice")
d = D()
d.foo()
替代解决方案
第一种情况下D(A,C)的MRO也包括所有类,因此正确排序super()和print(…)语句,可以使它工作:
class A(object):
def foo(self):
print("The")
super().foo()
class B(object):
def foo(self):
print("world")
class C(B):
def foo(self):
super().foo()
print("is")
class D(A,C):
def foo(self):
super().foo()
print("nice")
D().foo()
进一步阅读
要理解继承顺序(例如D类(C,A)或D类(A,C))和MRO,请参阅https://www.python.org/download/releases/2.3/mro/.详细描述了C3方法的分辨率顺序,并且有很好的绘制的ASCII类层次结构,标记了MRO.