如何初始化这个使用多重继承的派生 class?
How do I initialize this derived class that uses multiple inheritance?
假设我有一个名为 Vehicle
的 class,我有两个名为 Boat
和 Car
的子 class,它们继承自 Vehicle
.
现在假设我有一辆水陆两用车,它使用多重继承AmphibiousVehicle(Boat, Car)
。
现在我的问题是:AmphibiousVehicle
的__init__
函数应该怎么定义?
Boat
和 Car
都通过调用 super().__init__()
.
来初始化 Vehicle
Boat
和Car
需要在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'>)
假设我有一个名为 Vehicle
的 class,我有两个名为 Boat
和 Car
的子 class,它们继承自 Vehicle
.
现在假设我有一辆水陆两用车,它使用多重继承AmphibiousVehicle(Boat, Car)
。
现在我的问题是:AmphibiousVehicle
的__init__
函数应该怎么定义?
Boat
和 Car
都通过调用 super().__init__()
.
Vehicle
Boat
和Car
需要在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'>)