假设我有一个名为 Vehicle
的类,并且我有两个名为 Boat
和 Car
的子类,它们继承自 Vehicle
。
现在假设我有一个两栖车辆,它使用多重继承 AmphibiousVehicle(Boat, Car)
。
现在我的问题是:__init__
的 AmphibiousVehicle
函数应该如何定义?
Boat
和 Car
都通过调用 Vehicle
来初始化 super().__init__()
。
是否需要在Boat
的init中一一初始化Car
和AmphibiousVehicle
?
或者我可以只调用一次 super
吗?如果我这样做,我看不到 Car
是如何初始化的?
答案 0 :(得分:2)
Python 使用协作多重继承。这意味着您对 super()
的调用不一定会命中调用它的基类,它会从您开始的位置按照方法解析顺序 (MRO) 命中下一个类。< /p>
演示:
class A:
def __init__(self):
print("A.__init__")
super().__init__()
class B:
def __init__(self):
print("B.__init__")
super().__init__()
class C(A, B):
def __init__(self):
print("C.__init__")
super().__init__()
c = C()
给出输出:
C.__init__
A.__init__
B.__init__
因此类 super().__init__()
中的调用 A
调用类 __init__()
中的 B
,即使类 A
没有继承自类 B
.
只要您的所有类都确保它们在适当的时候调用 super
,您只需调用一次并相信一切都会合作。
MRO 基本上是 Python 在类中搜索方法或属性的顺序。您可以通过检查类的 __mro__
属性来检查该顺序是什么:
print(C.__mro__)
给我们:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)