python 面向对象 继承
- 什么是继承
继承表达的是一种”是“的关系,比如人是动物 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 继承是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象的这个过程,才能通过继承的方式去表达出抽象的结构
- 单继承
class father: pass class son(father): pass
- 多继承
class father1: pass class father2: pass class son(father1,father2): pass
- 查看当前类的基类
son.__bases__
- object类
没有指定父类的类,默认继承object类 (新式类)
- init方法注意点
子类如果没有实现自己的init方法 会调用父类的init方法 但这时候要注意的是,传入init方法的self是子类,而不是父类 所以如果调用self.func(),是指子类的func
- 派生属性/方法
派生属性 在基类属性的基础上添加的属性 派生方法 父类没有,子类自己创建的方法
- 子类调用父类的方法
子类调用父类的方法 方法一: 父类名.方法(self,参数) 方法二: 类内:super().方法() #不需要传入self,super默认传参super(类名,实例名) 类外:需要传入参数super(类名,实例名)
- 各种多继承情况
#钻石继承 A B C D 顺序:BCA #2 F A E B C D 顺序:BACEF #3 A E B C D 顺序:ABCE 方法:找到最左边的,然后往上找通过其他路不能找到的,直到最后一个不能找到的,如果没有找到,就会到直接继承的第二个,循环 查看继承顺序:类.mro() 新式类:广度优先 经典类的继承顺序:深度优先
- 接口类/抽象类
接口类是一套规范 ################ 接口提取了一群类共同的函数,可以把接口当做一个函数的集合。 然后让子类去实现接口中的函数。 ############ 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。 归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。 ########################## 实现方法: from abc import abstractmethod,ABCMeta class A(metaclass = ABCMeta): @abstractmethod def func(self): pass ############################### 接口隔离原则: 使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
抽象类1.什么是抽象类与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化2.为什么要有抽象类如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。从实现角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法。接口类与抽象类抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 - 继承的原理
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如 >>> F.mro() #等同于F.__mro__ [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>] 为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。 而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则: 1.子类会先于父类被检查 2.多个父类会根据它们在列表中的顺序被检查 3.如果对下一个类存在两个合法的选择,选择第一个父类