''' 什么时候用继承: 1、当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好 例如:描述一个机器人类,机器人这个大类是由很多互不相关的小类组成,如机械胳膊类、腿类、身体类、电池类 2、当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 例如:猫可以---喵喵叫、吃、喝、拉、撒;狗可以---汪汪叫、吃、喝、拉、撒;如果我们要分别为猫和狗创建一个类,那么就需要为猫和狗实现他们所有的功能,我们可以创建一个动物类,然后让他们继承动物类即可 继承有两个概念,一个叫继承,一个叫派生(衍生): 继承描述了子类属性从祖先类继承这样一种方式; 派生描述了子类衍生出新的特性,新类保留已存类类型中所有需要的数据和行为,但允许修改或者其它的自定义操作,都不会修改原类的定义。 ''' # 继承的实现 class Animal: '''定义一个动物类,包含相同功能吃喝拉撒''' def eat(self): print('%s吃' % self.name) def drink(self): print('%s喝' % self.name) def shit(self): print('%s拉' % self.name) def pee(self): print('%s撒' % self.name) # 在猫或狗的类里面,也可以重新定义吃喝拉撒的方法,__init__和cry其实都是派生(衍生) class Cat(Animal): '''定义一个猫的类,猫的叫声是独特的喵喵喵''' def __init__(self, name): self.name = name self.breed = '猫' def cry(self): print('喵喵叫') class Dog(Animal): '''定义一个狗的类,狗的叫声是独特的汪汪汪''' def __init__(self, name): self.name = name self.breed = '狗' def cry(self): print('汪汪叫') c1 = Cat('大黑猫') print(c1.__dict__) # {'name': '大黑猫', 'breed': '猫'} c1.cry() c1.eat() d1 = Dog('大狼狗') print(d1.__dict__) # {'name': '大狼狗', 'breed': '狗'} d1.cry() d1.drink() ''' 继承同时有两种含义: 1、继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2、声明某个子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法(接口继承实现需要导入abc模块) 继承的第二种含义非常重要,它又叫‘接口继承’;接口就叫一个函数,接口继承实质上是要求‘做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象’---这在程序设计上,叫做归一化 ''' import abc # 第一步导入abc模块 class All_file(metaclass=abc.ABCMeta): # 第二步metaclass=abc.ABCMeta '''一个接口类''' @abc.abstractmethod # 第三步@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') m1 = Mem() # 接口继承定义完后,Mem子类没有完全做到接口继承,因为有一个write方法没写,所以此时的实例化无法成功,会报错 # TypeError: Can't instantiate abstract class Mem with abstract methods write
接口继承与归一化设计
while True:
print('studying...')