接口继承与归一化设计

'''
什么时候用继承:
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...')
原文地址:https://www.cnblogs.com/xuewei95/p/14672117.html