抽象基类(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模块来进行改进了。
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