Python本身不提供抽象類和接口機制,要想實現抽象類,可以借助abc模塊。ABC是Abstract Base Class的縮寫。
#### abc.ABCMeta
這是用來生成抽象基礎類的元類。由它生成的類可以被直接繼承。
from abc import ABCMeta
class MyABC:
__metaclass__ = ABCMeta
MyABC.register(tuple)
assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)
上面這個例子中,首先生成了一個MyABC的抽象基礎類,然後再將tuple變成它的虛擬子類。然後通過issubclass或者isinstance都可以判斷出tuple是不是出於MyABC類。
另外,也可以通過復寫__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)
表明抽象方法的生成器
class C:
__metaclass__ = ABCMeta
@abstractmethod
def my_abstract_method(self, ...):
...
表明一個抽象屬性
class C:
__metaclass__ = ABCMeta
@abstractproperty
def my_abstract_property(self):
...
上例只是只讀屬性,如果是讀寫屬性,可以如下:
class C:
__metaclass__ = ABCMeta
def getx(self): ...
def setx(self, value): ...
x = abstractproperty(getx, setx)