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列表的顺序依次检查;
- 如果下一个待选的类中出现了两个合法的选择,那么就从第一个父类 选取