今天,我们要讲的是python的ABC 模块
这个模块是用来定义一个抽象类。具体的概要介绍可以浏览PEP 3119。
register
首先注册一个abc的虚拟子类
代码语言:javascript复制from abc import ABCMeta class MyABC: __metaclass__ = ABCMeta MyABC.register(tuple) assert issubclass(tuple, MyABC) assert isinstance((), MyABC)
在虚拟基类中,你也可以忽略这个方法。
__subclasshook__ (subclass)
(这个方法必须定义)
检查子类是否被确认为ABC的子类。你也可以自己定制一个issubclass方法,这样就不需要再调用register()了。这个方法可以返回Ture,False或NotImplemented。如果返回的是TRUE,这个子类就被认为是ABC的子类了。如果返回FALSE,这个子类就不被认为是ABC的子类。如果是NotImplemented 请检查 子类的继承关系和语法。
下面是一个实用的例子:
代码语言:javascript复制class Foo(object): 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)