Python自己不提供抽象類和接口機制,想要實現抽象類,能夠藉助abc模塊。ABC是Abstract Base Class的縮寫,是用來定義抽象類的,具體的介紹請參考PEP 3119。python
abc.ABCMeta,用來生成抽象基礎類的元類。由它生成的類能夠被直接繼承。ssh
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類。spa
檢查子類是否被確認爲ABC的子類。你也能夠本身定製一個issubclass方法,這樣就不須要再調用register()了。這個方法能夠返回Ture,False或NotImplemented。若是返回的是TRUE,這個子類就被認爲是ABC的子類了。若是返回FALSE,這個子類就不被認爲是ABC的子類。若是是NotImplemented 請檢查 子類的繼承關係和語法。也能夠經過複寫__subclasshook__(subclass)
來實現相同功能,它必須是classmethod。code
下面是一個實用的例子:繼承
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]]]]),代表一個抽象屬性get
class classname: __metaclass__ = ABCMeta @abstractproperty def my_abstract_property(self): ...
上例只是只讀屬性,若是是讀寫屬性,能夠以下:it