當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python abc.ABCMeta用法及代碼示例


用法:

class abc.ABCMeta

用於定義抽象基類 (ABC) 的元類。

使用這個元類來創建一個 ABC。 ABC 可以直接子類化,然後充當mix-in 類。您還可以將不相關的具體類(甚至內置類)和不相關的 ABC 注冊為 “virtual subclasses” - 這些及其後代將被內置 issubclass() 函數視為注冊 ABC 的子類,但注冊 ABC 不會t 出現在他們的 MRO(方法解析順序)中,注冊 ABC 定義的方法實現也不會被調用(甚至不能通過 super() 調用)。 1

使用ABCMeta 元類創建的類具有以下方法:

您還可以在抽象基類中重寫此方法:

有關這些概念的演示,請查看此示例 ABC 定義:

class Foo:
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable(ABC):

    @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 MyIterable 將標準可迭代方法 __iter__() 定義為抽象方法。這裏給出的實現仍然可以從子類中調用。 get_iterator() 方法也是MyIterable 抽象基類的一部分,但它不必在非抽象派生類中被覆蓋。

此處定義的__subclasshook__() 類方法表示,在其__dict__(或其基類之一,通過__mro__ 列表訪問)中具有__iter__() 方法的任何類也被視為MyIterable .

最後,最後一行使 Foo 成為 MyIterable 的虛擬子類,即使它沒有定義 __iter__() 方法(它使用 old-style 可迭代協議,根據 __len__()__getitem__() 定義) .請注意,這不會使 get_iterator 作為 Foo 的方法可用,因此它是單獨提供的。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 abc.ABCMeta。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。