Python高级特性(一)——抽象基类

一、定义

抽象基类(abstract base class, ABC)用来确保派生类中实现了基类中的特定方法,类似于Java中的抽象类。这里主要讨论如何使用Python中内置的模块adc来定义抽象基类

抽象基类的设计一般遵循以下原则,这样使得代码更好维护:

  • 基类无法实例化
  • 如果在子类中忘记实现接口方法,需要尽早报错

二、设计

现在,我们自己来设计一个抽象类

class Base:
    def foo(self):
        raise NotImplementedError

    def bar(self):
        raise NotImplementedError


class ChildClass(Base):
    def foo(self):
        print('foo() called')

    # def bar(self):
    #     print('bar() called')


if __name__ == '__main__':
    # 实例化基类
    b = Base()
    # 实例化一个子类,调用已实现的抽象函数
    c = ChildClass()
    c.foo()
    # 调用未实现的抽象函数
    c.bar()

在子类ChildClass中,只实现了一个抽象函数,我们在程序入口中实例化,分别调用已实现的未实现的抽象函数,运行结果如下:

foo() called
Traceback (most recent call last):
  File "abc.py", line 28, in 
    c.bar()
  File "abc.py", line 12, in bar
    raise NotImplementedError
NotImplementedError

说明了基类的抽象类只有被实例化之后才能调用,不然就会抛出异常。但是,在实例化基类的时候居然没有报错,这并不符合我们设计的原则,下面就得借助adb模块来进行改进了。

三、abc模块设计抽象基类

from abc import ABCMeta, abstractmethod


class Base(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        pass

    @abstractmethod
    def bar(self):
        pass


class ChildClass(Base):
    def foo(self):
        print('foo() called')

    # def bar(self):
    #     print('bar() called')


if __name__ == '__main__':
    # 实例化一个子类,调用已实现的抽象函数
    c = ChildClass()

这里,仍然没有实现bar抽象函数,abc模块就会使用abstractmethod装饰器来抛出异常

TypeError: Can't instantiate abstract class ChildClass with abstract methods bar

下面通过b = Base()实例化基类,也会抛出异常了

TypeError: Can't instantiate abstract class Base with abstract methods bar, foo

你可能感兴趣的:(Python高级特性)