2021-03-16 抽象基类

逻辑教育.png

抽象基类:(abstract base class,ABC)

抽象类就是类里定义了纯虚成员函数的类。纯虚函数一般只提供了接口,并不会做具体实现(虽然可以),实现由它的派生类去重写。抽象类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。简言之,ABC描述的是至少使用一个纯虚函数的接口,从ABC派生出的类将根据派生类的具体特征,使用常规虚函数来实现这种接口。

一种学院派思想认为,如果要设计类继承层次,则只能将那些不会被用作基类的类设计为具体的类。这种设计方法更清晰,复杂度低。

定义抽象基类是为了给子类继承实现具体的功能,它是”残缺的类“,里面没有抽象方法的具体代码,里面的抽象方法是被子类重写的!

import abc

class Zoo(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def monkey(self):
        pass

    @abc.abstractmethod
    def duck(self):
        pass

    def elephant(self):
        print("I am sleep.")

class SubZoo(Zoo):
    def monkey(self):
        print("I like banana.")

    def duck(self):
        print("Gua GUa Gua...")


sz = SubZoo()
sz.duck()
sz.monkey()
sz.elephant()

在Zoo()中定义了两个抽象方法monkey()和duck(),这两个方法必须要由子类重写,如果子类没有重写该方法,在实例化子类时程序就会抛出异常,即使没有调用该方法也会抛出异常。

TypeError: Can't instantiate abstract class SubZoo with abstract methods monkey

elephant()没有被装饰,所以它不是抽象方法,子类不必重写该方法,可以通过继承被访问到。

作为基类是不可以实例化的,如果强行对它实例化,程序将抛出异常

TypeError: Can't instantiate abstract class Zoo with abstract methods duck, monkey
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容