关于super()的一些见解

在搜索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表可知),这次是最后才到基类的,所以就不存在缺失。

 

感谢您的阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值