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

时间:2021-05-19 18:00:26

标签: python multiple-inheritance

假设我有一个名为 Vehicle 的类,并且我有两个名为 BoatCar 的子类,它们继承自 Vehicle

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

现在我的问题是:__init__AmphibiousVehicle 函数应该如何定义?

BoatCar 都通过调用 Vehicle 来初始化 super().__init__()

是否需要在Boat的init中一一初始化CarAmphibiousVehicle

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

1 个答案:

答案 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'>)