1.ABC模块作用
Python本身不提供抽象类和接口机制,想要实现抽象类,可以借助abc模块。ABC是Abstract Base Class的缩写,是用来定义抽象类的,具体的介绍请参考PEP 3119。
2.模块中的类和函数介绍
abc.ABCMeta,用来生成抽象基础类的元类。由它生成的类可以被直接继承。
register首先注册一个abc的虚拟子类
from abc import ABCMeta
class MyABC:
__metaclass__ = ABCMeta
MyABC.register(tuple)
assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
上面这个例子中,首先生成了一个MyABC的抽象基础类,然后再将tuple变成它的虚拟子类。然后通过issubclass或者isinstance都可以判断出tuple是不是出于MyABC类。
检查子类是否被确认为ABC的子类。你也可以自己定制一个issubclass方法,这样就不需要再调用register()了。这个方法可以返回Ture,False或NotImplemented。如果返回的是TRUE,这个子类就被认为是ABC的子类了。如果返回FALSE,这个子类就不被认为是ABC的子类。如果是NotImplemented 请检查 子类的继承关系和语法。也可以通过复写__subclasshook__(subclass)来实现相同功能,它必须是classmethod。
下面是一个实用的例子:
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)
abc.abstractmethod(function),表明抽象方法的生成器
class classname:
__metaclass__ = ABCMeta
@abstractmethod
def __my_abstract_method__(self):
...
abc.abstractproperty([fget[,fset[,fdel[,doc]]]]),表明一个抽象属性
class classname:
__metaclass__ = ABCMeta
@abstractproperty
def my_abstract_property(self):
...
上例只是只读属性,如果是读写属性,可以如下: