在Python多重继承的情况下,为什么根类需要调用super().__init__()?



为什么需要在基类中存在super().__init__()才能使子类中的super().__init__()通过两个继承分支运行?

下面的代码说明了在基类中使用和不使用super().__init__()时会发生什么:

import sys
#--------------------------------
class one():
def __init__(self):
super().__init__()
print("one")

class two():
def __init__(self):
super().__init__()
print("two")
class three(one,two):
def __init__(self):
super().__init__()
print("three") 
#--------------------------------
class uno():
def __init__(self):
print("uno")
class dos():
def __init__(self):
print("dos")
class tres(uno,dos):
def __init__(self):
super().__init__()
print("tres") 

print("python version")
print(sys.version)
print("---------------")
a = three()
print("---------------")
b = tres()

输出:

python version
3.8.12 (default, Aug 30 2021, 16:42:10) 
[GCC 10.3.0]
---------------
two
one
three
---------------
uno
tres

super()在多重继承情况下命名错误。每个类都有一个称为"方法解析顺序"的类列表。对于单继承,就是每个类后面跟着它的超类。对于多重继承,则更为复杂。

super()表示按照对象的方法解析顺序调用下一个实现。对于这个类,mro是树,然后是uno,然后是dos,最后是object。

Google "方法解析;查看更多信息。

通常在多重继承中,如果两个父类具有相同的定义(在本例中为__init__),则子类调用第一个父类(在本例中为一个)。然而,在一个人的__init__中,你可以调用另一个super,但是你会注意到一个人没有父级。在这种情况下,python调用第二个父节点的__init__

试着从两个里面移除super。你会得到相同的输出。现在撤销被删除的父类,从类1中删除父类,并更改继承顺序:

class three(two,one):

你将有三个调用两个,然后调用一个;因此输出"一二三"。多重继承和多级继承有一些这样的特殊情况,我同意Frank Yellin的观点,你最好只读一下MRO。

最新更新