目录 面向对象进阶 类的继承 类的派生 类的组合 菱形继承问题 子类中调用父类的方法 多态与多态性 鸭子类型 面向对象进阶 类的继承 什么是继承: 继承是一种创建新类的方式,新建的
目录
- 面向对象进阶
- 类的继承
- 类的派生
- 类的组合
- 菱形继承问题
- 子类中调用父类的方法
- 多态与多态性
- 鸭子类型
面向对象进阶
类的继承
什么是继承:
- 继承是一种创建新类的方式,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。
- 继承的特性是:子类会遗传父类的属性
为什么用继承:
可以减少代码的冗余,解决代码重写问题.继承的语法: # class 类名(父类名): pass
python中查看对象所继承的类,使用
.__bases__
方法- 在Python3中如果一个类没有继承任何类,则默认继承object类
- 在Python2中如果一个类没有继承任何类,不会继承object类
有继承关系下查找属性的顺序:
- 优先找自身,自身没有找父类
- 父类没有找父类的父类
- 一直找到最顶级的父类,如果还没有报错
类的派生
派生: 子类可以添加自己新的属性或者在自己这里重新定义父类已有的一些属性,需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准.
类的组合
通过继承建立了派生类与基类之间的关系,它是一种‘是‘的关系,调用的是自身的属性和方法.
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,还是得通过组合的类来调用它内部的属性和方法.
菱形继承问题
类可分为经典类和新式类
- 经典类:
- 没有继承object的类以及该类的子类,都是经典类
- 只有Python2中才有经典类
- 新式类:
- 继承了object的类以及该类的子类,都是新式类
- Python3中所有的类都是新式类
- 经典类:
当继承为菱形继承的时候,经典类和新式类搜索某一个属性的顺序会不一样
- 在新式类中:当遇到菱形继承时,会以广度优先查找
- 在经典类中:当遇到菱形继承时,会以深度优先查找
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序的MRO列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,可以通过
.__mro__
的方法查看.
子类中调用父类的方法
- 在子类中通过父类名.父类方法(self)的方式调用,把这种调用方式当作对普通函数方法的调用
- super()/super(类名,self)的方式
- 当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。只要每个重定义的方法统一使用super(),并只调用它一次,那么最终会遍历完整个MRO列表,每个方法也只会被调用一次.
多态与多态性
多态:对象的多种状态 - 父类对象的具有多种子类对象的状态
多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法).
在python中通过在父类中引入abc模块的abc.abstractmethod
装饰器定义为抽象父类,通过在子类中重写来具体像可以实现多态性.
鸭子类型
- 规定有什么属性及什么方法的类的类型叫鸭子类型
- 能提供出规定的属性与方法的对象就是鸭子
- 也就是像鸭子就是鸭子