abc
ABC是Abstract Base Class的缩写。
Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助abc模块。
abc类中常见的方法有:ABCMeta,abstractmethod,classmethod
abc.ABCMeta
这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。
具体化抽象类的方法有两种:
通过注册(register)
通过继承
通过注册进行具体化抽象类
from abc import ABCMeta
#生成实现类
class Foo:
def __getitem__(self, index):
...
def __len__(self):
...
def get_iterator(self):
return iter(self)
#生成基类,
class MyIterable(metaclass=ABCMeta):
#我是一个虚拟方法
@abstractmethod
def __iter__(self):
while False:
yield None
def get_iterator(self):
return self.__iter__()
@classmethod
def __subclasshook__(cls, C):
if cls is MyIterable:
if any("__iter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
#将实现类注册到虚拟类中
MyIterable.register(Foo)
通过继承具体化抽象类
#构建抽象类
class PluginBase(metaclass= abc.ABCMeta):
#__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def load(self, input):
"""Retrieve data from the input source and return an object."""
return
@abc.abstractmethod
def save(self, output, data):
"""Save the data object to the output."""
return
#构建具体类,其继承了抽象类,实现了抽象类的方法
class SubclassImplementation(PluginBase):
def load(self, input):
return input.read()
def save(self, output, data):
return output.write(data)
#判断是否真的实现了继承
if __name__ == '__main__':
print 'Subclass:', issubclass(SubclassImplementation, PluginBase)
print 'Instance:', isinstance(SubclassImplementation(), PluginBase)