如何初始化这个使用多重继承的派生 class?

How do I initialize this derived class that uses multiple inheritance?

假设我有一个名为 Vehicle 的 class,我有两个名为 BoatCar 的子 class,它们继承自 Vehicle.

现在假设我有一辆水陆两用车,它使用多重继承AmphibiousVehicle(Boat, Car)

现在我的问题是:AmphibiousVehicle__init__函数应该怎么定义?

BoatCar 都通过调用 super().__init__().

来初始化 Vehicle

BoatCar需要在AmphibiousVehicle的初始化中一一初始化吗?

或者我可以只调用 super 一次吗?如果这样做,我看不到 Car 是如何初始化的?

Python 使用合作多重继承。这意味着您对 super() 的调用不一定会命中调用位置的基数 class,它会命中 方法解析顺序 [=39] 中的下一个 class =] (MRO) 从你开始的地方开始。

演示:

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__

因此 class A 中的 super().__init__() 调用 class B 中的 __init__(),即使 class A 不继承自 class B.

只要你所有的 classes 确保他们在适当的时候调用 super,你只需要调用一次并相信一切都会合作。

MRO 基本上是 python 在 class 中搜索方法或属性的顺序。您可以通过检查 class:

上的 __mro__ 属性来检查此顺序是什么
print(C.__mro__)

给我们:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)