在搜索super函数是发现有个博主提出了这样的问题如下:
class Base():
def __init__(self):
print('base')
class Pase():
def __init__(self):
print('pase')
class A(Base):
def __init__(self):
super().__init__()
print('a')
class B(Pase):
def __init__(self):
super().__init__()
print('b')
class C(A,B): #class C(B,A):
def __init__(self):
super().__init__()
print('c')
if __name__=='__main__':
c = C()
print(c.__class__.__mro__)
分别有两个结果如下:
base
a
c
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.Base'>, <class '__main__.B'>, <class '__main__.Pase'>, <class 'object'>)
<__main__.C object at 0x00000287494B62E8>
pase
b
c
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.Pase'>, <class '__main__.A'>, <class '__main__.Base'>, <class 'object'>)
按理说,按照mro表上两次结果都应该包含另外一个父类(A/B)但C就继承了一个类,着实奇怪。于是又在网上找了找,发现其结果,super函数其机制是
def super(cls, inst):
mro = inst.__class__.mro()
return mro[mro.index(cls) + 1]
由于采用的是DFS(深度优先搜索,mro列表是利用c3线性算法实现的),所以必先到达一个基类,但是基类没有super函数,于是super就传递失败并结束。
但如果是这样:
class Base():
def __init__(self):
print('base')
class A(Base):
def __init__(self):
super().__init__()
print('a')
class B(Base):
def __init__(self):
super().__init__()
print('b')
class C(A,B):
def __init__(self):
super().__init__()
print('c')
if __name__=='__main__':
c = C()
print(c.__class__.__mro__)
结果如下
base
b
a
c
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>)
这时候采用的是BFS搜索法(广度优先搜索,看mro表可知),这次是最后才到基类的,所以就不存在缺失。
感谢您的阅读