Python中super()函数介绍

super()函数是用来子类调用父类方法的一个类。如下图,确实是个类。

在这里插入图片描述
正常使用super().来访问父类方法的单继承方式比较简单,直接使用super().方法名即可。
本文主要记录一下在Python中多继承的时候super中的两个参数。
本文主要围绕一下例子来进行说明。

class D():
    def __init__(self):
        print('enter D')
        print('leave D')


class B(D):
    def __init__(self):
        print('enter B')
        super().__init__()
        print('leave B')


class C(D):
    def __init__(self):
        print('enter C')
        super().__init__()
        print('leave C')


class A(B, C):
    def __init__(self):
        print('enter A')
        super().__init__()
        print('leave A')


A()

Python中可以解决菱形继承的问题,其实也就是解决怎么调用父类方法的问题。

这其实就是一个有向无环图得出线性序列的问题。也就是进行拓扑排序。关于拓扑排序百度百科上有较为详细的说明。需要先理解拓扑排序的算法。正常来讲拓扑排序得到的序列可能不唯一,但在Python的MRO(Method Resloution Order,方法解析序列)是先左后右。所以可以得到一个唯一的序列。比如在上述问题中,拓扑排序的序列是[A,B,D,C,object],object是因为Python中所有的类都会继承。

序列问题解决了接下来说明super类,super会接受两个很重要的参数,比如在上述class A中,完整的super写法应该是super(A,self)._init_()。这其中self表示从self开始的MRO,也就是[A,B,D,C,object],而A是从A开始向父类中寻找_init_()方法,也就是从[B,D,C,object]中寻找。

在B中执行_init_()方法时,B的super也默认接受了两个参数super(B,self),但这个self是从A传过去的,所以表示的还是A所对应的MRO,但是此时就是从B开始的了。也就是说在B中执行super()._init_()时是从[D,C,object]中寻找并执行_init_()方法。依次类推,所得到的结果如下

enter A
enter B
enter C
enter D
leave D
leave C
leave B
leave A

总结一下,super的两个关键点在于一个拓扑序列、以及参数的意义。
super(T1,T2)的意义是,从T2的MRO中的T1后的父类类寻找要执行的方法

本文为简单介绍,参考网络文章了解的想法,如有不对欢迎指出
参考文章:
https://www.cnblogs.com/kefeiGame/p/9176802.html
https://blog.csdn.net/weixin_40907382/article/details/80277152

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值