从0基础学习Python(Day14)
面向对象的3大特征 [封装,继承,多态]
1.封装
是指在面向对象编程的思想中,对代码进行高度的封装,封装又叫包装。
封装在编程中的核心作用:整体化代码,便于携带,提高数据或算法的安全性
面向对象的编程思想核心:高类聚、低耦合—程序的设计模式的范畴
2.继承
在程序中继承是指描述的是多个类之间的一个所属关系
例如一个类A里面的所有的属性和方法可以复用,这个时候可以通过继承的方式,传递到类B里面
这这里A类称之为父类(基类) B类称之为子类(派生类)
在Python中子类(派生类)会继承父类(基类),那么子类就及继承了父类中的属性和方法,简化了子类的设计问题,便于后期的维护和升级
=–=继承的作用
思考:使用面向对象思想实现一个小Game,王者(英雄个体多)
每个英雄都有:基础血量、基础攻击力、基础等级、名字、基础防御
每个英雄都会:移动、说话、回城
实现一个英雄(安其拉),剩下的60个英雄每个都要书写这些代码在对象中
本来安琪拉这个英雄代码量使用3000行–>2mb,而以上的共有代码占据1500行=1m
120MB
61mb
显示的解决方案:创建一个英雄的基类Hore,这个类具有所有的功能,然后每个英雄自己去实现自己的额外功能
继承能够极大程度的减少代码中的冗余程度
继承便于系统的后期维护工作
3.继承
[1]单继承
概念
一个类只继承了一个父类
如果子类继承了父类,子类就继承了父类的属性和方法
[2]多继承
概念
一个类继承了多个父类
子类继承了多个父类,则子类就会继承父类的所有的不同名的方法
如果多个父类的方法名相同(_init_,kongfu)
子类只会继承第一个父类的这个方法
通过一个类创建对象成功后,必须要执行一次init方法(可能是自己类中的,或者是父类中的)
为什么子类会继承第一个父类的属性
如果子类中没有init这个方法,那么所有的父类中的init方法只有第一个父类的执行了,如果子类中也有init方法,那么所有的父类中的init方法都不会执行
结论
-
如果多个父类的方法名不相同
子类会全部继承
-
如果多个父类的方法名相同
子类会继承第一个父类的
-
如何决定子类继承哪个父类的属性
看子类到底继承了哪个父类的__init__方法
-
如果子类也有父类的同名方法,那么子类就会选择自己的这个方法,
-
如果子类中也有__init__方法,那么所有的父类的属性都不会被继承
-
通过一个类创建对象,必须要执行一次init方法
找init方法的顺序要遵循类的继承链
-
如何查看一个类的继承链
类名._mro_
4.子类重写父类的同名方法和属性
子类继承了父类
- 子类实现了父类的同名方法,为了做自己特有的事情可以进行重写
- 如果通过子类创建一个对象,如果调用方法,它遵循的是类的继承连
重写
是指在子类中重新去写父类中已经拥有的方法,并且在子类中保持这个方法的名字不变,只有方法体发生改变,那么调用子类对象的这个方法以后都是子类中所写的
5.子类调用父类的同名属性和方法
场景
-
子类继承了父类,父类不能满足子类的需求。子类重写父类的同名方法
-
但是子类还想在其类内部使用父类的同名方法
class Shi(object): def work(self,x,y): return x+y class Tu(Shi): def work(self,x,y): return Shi.work(self,x,y)/2 pass
方式
-
子类中:
父类名.父类的同名方法(self)
-
使用super
super函数是用来获取指定的子类在继承链中的后一个类给当前子类的self
super(子类名,self).父类同名方法
一般情况下获取当前子类的直接父类的同名方法可以省略括号中的参数
super().父类同名方法
6.多层继承
和多继承其实是一个原理,包括调用父类中的同名方法,包括super函数的使用都是一样的原理
Day14-------END