18.2 abc:抽象基类
抽象基类是一种接口,与单个hasattr()检查特定方法相比,抽象基类的检查更为严格。通过定义一个抽象基类,可以为一组子类建立一个公共API。有些情况下,可能需要一个对应用源代码不太熟悉的人提供插件扩展,这种情况下这个功能就特别有用,另外对于大型团队合作或者处理一个很大的代码基(同时跟踪所有类很困难,甚至不可能)也很有帮助。
18.2.1 ABC如何工作
abc的做法是,将基类的方法标记为抽象,然后注册具体类作为这个抽象基类的实现。如果应用或库需要一个特定的API,则可以用issubclass()或isinstance()根据抽象类检查对象。要使用abc模块,首先,定义一个抽象基类来表示一组插件的API,用于保存和加载数据。设置新基类的metaclass为ABCMeta,并使用修饰符为这个类建立公共API。下面的例子使用了abc_base.py。
import abc
class PluginBase(metaclass=abc.ABCMeta):
@abc.abstractmethod
def load(self,input):
"""Retrieve data from the input source
and return an object.
"""
@abc.abstractmethod
def save(self,output,data):
"""Save the data object to the output."""