# 面向对象的三大特性之继承 # 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好 (如机器人) # 当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 (动物——猫) # 继承同时有两种含义:1,继承基类的方法,并且做出自己的改变或扩展(代码重用),这种意义并不大,因为它使子类和基类出现强耦合 # 2,声明某个子类兼容于某基类。定义一个接口类,子类继承接口类,并实现接口中定义的方法 # 接口继承只是接口类规定了子类必须实现的方法,但是接口类里不去实现,子类继承后,在子类中再写具体实现的方法 # 可以导入abc模块,并使用装饰器@abc.abstractmethod,限定子类必须要定义接口类中的方法 import abc # 导入abc模块 class AllFile(metaclass=abc.ABCMeta): # 定义接口类 @abc.abstractmethod # 使用装饰器,限定子类中必须要定义下面的方法 def read(self): # 仅有方法名称,并没有具体内容,仅是为了规范子类 pass @abc.abstractmethod def write(self): pass class Disk(AllFile): # 子类Disk继承AllFile接口类 def read(self): # 必须定义接口提供的两个方法,否则实例化时会报错 print('Disk read') # 方法的具体实现代码 def write(self): print('Disk write') class Cdrom(AllFile): def read(self): print('Disk read') def write(self): print('Disk write') d = Disk() # 新式类的继承顺序(广度优先) print(Disk.__mro__) # 显示新式类的继承顺序方法1 print(Disk.mro()) # 显示新式类的继承顺序方法2 # 子类中调用父类的方法 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('父类方法') class Subway(Vehicle): def __init__(self, name, speed, load, power, line): super().__init__(name, speed, load, power) # 通过super()调用父类的方法 self.line = line # 子类 def show_info(self): print(self.name, self.speed, self.load, self.power, self.line) def run(self): super().run() print('子类方法') line13 = Subway('北京地铁', '10km/s', 10000, '电', 13) line13.show_info() line13.run()