类继承、组合和抽象类 继承 组合 接口 抽象类实现接口

继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类。

如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

组合

软件重用的重要方式除了继承之外还有组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

>>> class Equip: #武器装备类
...     def fire(self):
...         print('release Fire skill')
... 
>>> class Riven: #英雄Riven的类,一个英雄需要有装备,因而需要组合Equip类
...     camp='Noxus'
...     def __init__(self,nickname):
...         self.nickname=nickname
...         self.equip=Equip() #用Equip类产生一个装备,赋值给实例的equip属性
... 
>>> r1=Riven('锐雯雯')
>>> r1.equip.fire() #可以使用组合的类产生的对象所持有的方法
release Fire skill

接口

继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

      继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

      归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

2. 为何要用接口
      接口提取了一群类共同的函数,可以把接口当做一个函数的集合。然后让子类去实现接口中的函数。

      这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

low版使用class模拟接口

# low版 模拟接口
class Interface:
    def read(self):
        raise AttributeError

    def write(self):
        raise AttributeError


class Txt(Interface):
    def read(self):
        print("from txt read")

    # def write(self):
    #     print("from txt write")


a = Txt()    #
a.read()     # from txt read
a.write()    # AttributeError

抽象类实现接口

抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

# 抽象类abc:模拟接口,实现
import abc
class Interface(metaclass=abc.ABCMeta):


    @abc.abstractmethod
    def read(self):
        """子类必须定义读功能"""
        psss


    @abc.abstractmethod
    def write(self):
        """子类必须定义写功能"""
        pass


class Txt(Interface):
    def read(self):
        print("from txt read")


    def write(self):
        print("from txt write")



class Sata(Interface):
    def read(self):
        print("from sata read")


    def write(self):
        print("from sata write")



a = Txt()
b = Sata()
b.read()    # from sata read
# b.write   # TypeError: Can't instantiate abstract class Sata with abstract methods write
a.write()   # from txt write
a.read()    # from txt write