继承
一、什么是类的继承?
类的继承跟现实生活中的父,子,孙子,继承关系一样,父类又称为基类。
python中类的继承分为:单继承和多继承
class ParentClass1: pass class ParentClass2: pass class SubClass(ParentClass1): pass class SubClass(ParentClass1,ParentClass2): pass
二:继承的两种含义:
1.继承基类的方法,并且做出自己的改变或扩展(代码重用)
2.声明某个子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法
第一种含义意义不大,因为它使得子类与基类出现强耦合(即有关联)
第二种叫做接口继承,“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的对象”---------这在程序设计上,叫做归一化
接口继承:并不是为了省代码,----------父类只规定子类必须实现的方法,但父类不实现,子类来具体实现
接口实际上就是方法
import abc class All_file(metaclass=abc.ABCMeta): @abc.abstractmethod #抽象:不用具体实现 def read(self):
‘子类必须实现读功能’ pass @abc.abstractmethod def write(self):
‘子类必须实现写功能’ pass class Disk(All_file): def read(self): print('disk read') def write(self): print('disk write') class Cdrom(All_file): def read(self): print('cdrom read') def write(self): print('cdrom write') class Mem(All_file): def read(self): print('mem read') # def write(self): # print('mem write') # m1=Mem() # 报错:TypeError: Can't instantiate abstract class Mem with abstract methods write
python到底是如何实现继承的?
对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止
继承顺序:经典类:深度优先(找到最底)
新式类:广度优先(最后找最底)
python3中全是新式类
#coding:utf-8 class A: def test(self): print('A') pass class B(A): # def test(self): # print('B') pass class C(A): # def test(self): # print('C') pass class D(B): # def test(self): # print('D') pass class E(C): # def test(self): # print('E') pass class F(D,E): # def test(self): # print('F') pass f1=F() f1.test() #经典类:F->D->B->A-->E--> print(F.__mro__) # (<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) #F-->D->B-->E--->C--->A新式类
子类中调用父类方法:
class Vehicle: Country='China' def __init__(self,name,speed,load,power): self.name=name self.speed=speed self.load=load self.power=power def run(self): print('开动啦') print('开动啦') class Subway(Vehicle): def __init__(self,name,speed,load,power,line): Vehicle.__init__(self,name,speed,load,power) self.line=line def show_info(self): print(self.name,self.speed,self.load,self.power,self.line) def run(self): Vehicle.run(self) print('%s %s 线,开动啦' %(self.name,self.line)) line13=Subway('北京地铁','10km/s',1000000000,'电',13) line13.show_info() line13.run()
super方法:
Vehicle.__init__(self,name,speed,load,power)
==super().__init__(name,speed,load,power)
Vehicle.run(self)
==super().run()