面向对象之继承
面向对象的三大特征:
一、继承:
- 定义:继承是创建新类的方式,新建的类可以继承一个或多个父类(python中支持多继承)。
- 继承分为单继承(继承一个父类)和多继承(继承多个父类)
- 为什么要用继承:在程序中,通过继承,可以得到父类的所有属性(包括数据属性、函数属性)。
- 查看继承:
父类在继承中又称为基类,即基于这个父类而创建的新类,查看父类的方式:
Sun.__bases__()(查看Sun所继承的所有基类(父类))
Sun.__base__()(从左到右查看第一个基类(即父类))
如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。
二、继承与抽象:
抽象:抽取多个类中的共同部分,组成一个新的类。抽象最主要的作用是划分类别。
通过抽象:得到公共部分的属性,并放到一个类中,并作为父类。
通过继承:避免了重复代码。
先抽象再继承,继承是基于抽象的结果,肯定先经过抽象的过程,再通过继承的方式去表达出抽象的结构
分析:继承所生成的所有子类,只要基类中包含了这个父类,得到的子类肯定包含这个基类中的所有属性,也就是说,这些子类都含有某些相同属性,那么我们在考虑问题的时候,可以先把这些共同属性抽取出来,放到一个类中,并把这个类作为父类,进行继承,所以说现有抽象,再有继承。
四、派生:
定义:派生指的是子类继承某个父类,并且这个子类拥有自己独特的属性和方法(即子类类中得有自己的属性,否则与父类完全相同),得到一个派生类。
重用:实质是子类中再次用到父类中定义的属性,包括方法和数据。
重用的方式有两种:
1.父类名.父类中的方法名(指名道姓)
2.super().父类中的方法名
super().方法名的方式:supper().实质是相对于一个对象,会按照对象访问属性的方式进行访问,即有先后顺序。
(在Python2中,super()的用法super(子类名,self) ).方法。参数为当前类,当前对象
super用在存在继承关系的子类中。
查找顺序:1.对象->类->父类->父类的父类。。。。。
2.如果一个子类由多个父类,那么查找到父类级别时,顺序是从左到右。
3深度优先,沿着一条继承路径找到底,如果没有,再找其他继承路径
4.当存在共同父类时,会产生菱形继承关系。菱形继承关秀:先深度优先,然后再广度优先。
经典类与新式类的区别:
所有直接继承或间接继承object的类,都是新式类。(object 称之为根类,意思是所有类都源自于object类,简单的说object提供了一些常用的基础操作。)
即所有类都属于新式类(在python3中)
在python3中,默认所有类都是新式类;在python2中默认是经典类:不会自动继承object。
在经典类中,属性的查找按照深度优先,一条路走到黑。(Python2中才有经典类。)
调用.mro()该方式,会显示查找顺序。
.super()访问父类时,按照mro列表查找。