不幸的是,如果不了解方法解析顺序(MRO)D
,没有办法调用super()
in D
到达both基类。
但 MRO 是一个强大的概念。在第二种情况下,
class D(C,A):
...
(MRO) 是
>>> D.mro()
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
只要打电话super()
正如 Pieters 先生所说,带您进入 MRO 的下一堂课,并且您希望打印语句按以下顺序出现:A
, B
, C
, then D
, 简单的说super().foo()
首先和print(...)
每个定义中的第二个foo()
。唯一的例外是不要放super().foo()
在班上A
因为foo()
没有定义在object
.
Solution
#! /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()
替代解决方案
的 MROD(A,C)
在第一种情况下也包括所有类,因此正确的排序super()
and 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()
进一步阅读
了解继承顺序(例如class D(C,A)
or class D(A,C)
)和 MRO,请参阅https://www.python.org/download/releases/2.3/mro/。 C3 方法解析顺序被详细描述,并且有很好地绘制的带有 MRO 标记的 ASCII 类层次结构。