继承
继承
继承是一种新建类的方法,新建的类称之为子类或派生类,继承的父类称之为基类或超类
--在python中,一个类可以继承多个父类
--在其他语言中,一个类只能继承一个父类
继承的作用
减少代码冗余()
继承的实现
先抽象再继承:
抽取对象之间相似的部分,总结出类
抽取类之间相同的部分,总结出父类
--在定义类子类时; class 子类名(父类名)
继承背景下对象属性的查找顺序
对象属性的查找顺序:
- 先从对象自己的名称空间中查找.
- 对象中没有,从子类的名称空间中查找.
- 子类中没有,从父类的名称空间中查找,若父类没有,则会报错.
ps:程序的执行顺序是由上到下的,父类必须定义在子类的上方.
派生
派生:
指的是子类继承父类的属性与方法,并且派生出自己独有的属性与方法.若子类中的方法与父类的相同,优先用子类的
子类继承父类并重用父类的属性与方法问题
问题: 子类重写父类的–init–导致代码更加冗余
方法: 1.直接引用父类的–init–为其传参,并添加子类的属性.
2.通过super来指向父类的属性. -super()是一个特殊的类,调用super得到一个对象,该对象指向父类的名称空间.
注意:两种方式都可以使用,但不能混合在一起使用
经典类新式类
新式类: 继承object都是新式类,python3里面都是新式类,默认继承object
经典类: 经典类只有在python2中才会存在,凡是没有继承object的都是经典类
super方法
super的继承顺序严格遵循mro继承序列,多继承情况下,从左到右.
在python3中提供了一个新式类查找顺序的内置方法.mro()会把当前类的继承关系列出来.然后按照mro列表的 顺序往后查找.
砖石继承(菱形继承)
mro 的查找顺序:
新式类: 广度优先 从左往右依次查找,查找到最后一个类时,会继续往后面的继承查找.
经典类: 深度优先 从左往右查找,会直接查找至最后一个类