python类与对象part3

来源:互联网 发布:手游源码一般多少钱 编辑:程序博客网 时间:2024/06/14 08:51

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 printanimal print

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

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

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