python类与对象part3

本文介绍了Python中super()函数的使用方法及其应用场景,特别是在子类中如何调用已被覆盖的父类方法。此外还探讨了方法解析顺序(MRO)以及C3线性化处理技术。

1. 调用父类中的方法

我们想要调用一个在子类中已经被覆盖的父类的方法要怎么做呢?答案是通过super()函数来完成
比如以下:

class Animal():
    def __init__(self,kind):
        self.kind = kind

    def prin(self):
        print('animal print')
class Bird(Animal):
    def __init__(self,kind):
        super().__init__(kind)

    def prin(self):
        print('bird print')
        super(Bird, self).prin()

bird=Bird('bird')
bird.prin()

上例的运行结果:

bird print
animal print

有结果可知我们在子类中调用了已经被子类覆盖的父类的方法
super()在没有显式列出基类的时候也可以正常工作
super()函数的一种常见的用途就是调用父类的__init()__方法,确保父类被正确的初始化了

关于super()方法的正确使用,首先我们需要了解一下python是如何实现继承的。针对每一个定义的类,python都会计算出一个称为方法解析顺序(MRO)的列表,MRO列表只是简单的对所有的基类进行线性排序。要实现继承,python会从MRO标的最左边的类开始,从左到右依次查找,直到找到待查的属性为止。
对于MRO列表本身是怎么确定呢?这里用到了一种称为C3线性化处理的技术。简单来说就是一种针对父类的归并排序,他需要满足三个条件:

  • 先检查子类再去检查父类;
  • 有多个父类的时候,按照MRO列表的顺序依次检查;
  • 如果下一个待选的类中出现了两个合法的选择,那么就从第一个父类 选取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值