不幸的是,如果不知道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.