day 20
day 20 面向对象的三大特性 (继承,封装,多态)
01.继承
-
什么是继承
- 继承指的是新建立的方法,新建的类称之为子类或者派生类,自类继承的类叫做父类,也称之为基类或超类。
- 继承的特征;
- 子类可以继承父类的属性(特征与技能(变量与函数)),并且可以派生出自己的属性
- 一个子类可以继承多个父类(python的特性)
-
为什么要继承
- 继承的目的是为了减少代码的冗余(代码的重复)
-
如何实现继承
- 首先要确定好谁是子类,谁是父类。
- 在定义类时,子类+(),()内写括号父类,实现继承。
class fu: xx='xx' class f2: zz='zz' class zl(fu): yy='yy' class z2(fu,f2): # 继承多个父类 dd='dd'
-
查看继承的父类,__bases__(以元组的形式)
class F1:
pass
class F2:
pass
class Z1(F1,F2):
pass
print(Z1.__bases__)
(<class '__main__.F1'>, <class '__main__.F2'>)
- 如何寻找继承关系;
- 想要寻找继承关系,现抽象在继承
- 抽象;
- 抽取相同的属性,定义为父类
- 在程序中继承
- 对象——>调用类——>继承父类
- 继承的关系;
- 对象是一些列相同的特征和技能的结合体
- 类是一些列又有相同特征和技能的对象结合体
- 继承类是一些列又有相同特征和技能的类结合体
- 继承背景下对象属性查找顺序
- 对象本身的空间——>类空间——>父类空间——>报错
- 派生
- 派生指的是子类在继承父类属性基础上,拥有自己的属性
- 子类派生出的属性若与父类的相同,则以子类的为准
- 派生状态下继承的用法
- 新式类与经典类
- 新式类;所有继承object的类,python3中都是新式类
- 经典类;在python2中只要没有继承object都是经典类
- 再多继承情况下的查看当前类的继承顺序 mro()
- 从左到右
- 查找顺序;本身——>从左到右的父类——>object——>报错
- 子类. mro() # 查看字类的继承顺序,mro继承自object(type与object相互继承)
- 菱形继承的继承顺序
- 在多继承的情况下形成的
- 在经典类和新式类下的继承顺序不同
- 经典类会根据深度优先(一条线一条线找,第一条线就找到根类)
- 新式类会根据广度优先(一条线一条线找,最后一条线才找到根类)(继承object的那个类)
- 最后才寻找继承object的那个类