Python ABC 接口究竟是如何工作的?

shi*_*asu 0 python inheritance abc python-3.x

我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:

请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化

所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。

例如,isinstance([], abc.Iterable), 返回True列表,也是如此abc.Sequenceabc.MutableSequence这是有道理的。对于isinstanceissubclass方法,以下内容也是如此。

issubclass(str, abc.MutableSequence) --> False
isinstance((), abc.MutableSequence)  --> False
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:

class A:
    def __iter__(self):
        pass

a = A()
isinstance(a, abc.Iterable) # True
issubclass(A, abc.Iterable) # True
Run Code Online (Sandbox Code Playgroud)

但是 Aabc.Iterable在它的类定义中没有子类化(并且,我假设前面提到的其他类也没有,根据这本书)。这些issubclass / isinstance方法和 ABC 接口在这里是如何工作的?这些函数是否只是在类定义中查找 dunder 方法签名并将它们与上述 ABC 类中的 dunder 签名匹配?

除了提供一种验证类是否包含某些特定的 dunder 方法之外,我看不到 ABC 类的任何目的,因此了解更多有关整个过程的目的会很好。

任何形式的帮助将不胜感激。谢谢。

che*_*ner 5

Iterable如果类有__subclasshook__方法,True则定义要返回的类__iter__方法。

@classmethod
def __subclasshook__(cls, C):
    if cls is Iterable:
        return _check_methods(C, "__iter__")
    return NotImplemented
Run Code Online (Sandbox Code Playgroud)

有两种方式a可以成为 的子类b。要么a可以继承自b(或 的子类b),要么b.__subclasshook__(a)可以返回True

由于isinstance(a, b)检查是否type(a)是 的子类b,因此也受 的定义影响__subclasshook__