Python — abc module
- 2020 年 1 月 6 日
- 筆記
今天,我們要講的是python的ABC 模組
這個模組是用來定義一個抽象類。具體的概要介紹可以瀏覽PEP 3119。
register
首先註冊一個abc的虛擬子類
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 請檢查 子類的繼承關係和語法。
下面是一個實用的例子:
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)