当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。