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

2024-10-02 00:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在假设我有一辆两栖车,它使用多重继承

现在我的问题是AmphibiousVehicle__init__函数应该如何定义

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

我需要在AmphibiousVehicle的init中逐个初始化BoatCar

或者我可以打一次电话给super?如果我这样做,我看不到Car是如何初始化的


Tags: 函数定义initcar子类电话supervehicle
1条回答
网友
1楼 · 发布于 2024-10-02 00:42:29

Python使用协作多重继承。这意味着您对super()的调用不一定会命中调用它的基类,而是命中从您开始的方法解析顺序(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__

因此,类A内的调用super().__init__()调用类B内的__init__(),即使类A不从类B继承

只要您的所有类都确保它们在适当的地方调用super,您只需要调用它一次,并相信一切都会合作

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

print(C.__mro__)

给了我们:

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

相关问题 更多 >

    热门问题