• 接口继承与归一化设计


    '''
    什么时候用继承:
    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...')
  • 相关阅读:
    核心动画的使用
    核心动画的使用
    核心动画的使用
    异常上报功能Bugly简介
    核心动画的使用
    一种传统的程序模块化马甲包开发架构
    定时器、多线程
    核心动画
    Core Animation 核心动画
    核心动画的使用
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14672117.html
Copyright © 2020-2023  润新知