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

How exactly does Python ABC interface work?

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

Note that the built-in concrete sequence types do not actually subclass the Sequence and MutableSequence abstract base classes (ABCs) depicted

所以我从 Python 文档中查看了 ABC,但我无法理解它们的用途。

例如,isinstance([], abc.Iterable)、returns True 用于列表,abc.Sequenceabc.MutableSequence 也是有道理的。对于 isinstanceissubclass 方法,以下也是如此。

issubclass(str, abc.MutableSequence) --> False
isinstance((), abc.MutableSequence)  --> False

如果我执行以下操作:

class A:
    def __iter__(self):
        pass

a = A()
isinstance(a, abc.Iterable) # True
issubclass(A, abc.Iterable) # True

但是 A 在它的 class 定义中没有 subclass abc.Iterable (而且,我假设前面提到的其他 classes 也没有,根据书)。 issubclass / isinstance 方法和 ABC 接口在这里如何工作? 这些函数是否只是在 class 定义中查找 dunder 方法签名并将它们与提到的 ABC Class?

中的 dunder 签名相匹配

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

如有任何帮助,我们将不胜感激。谢谢。

如果 class 有一个 __iter__ 方法,

Iterable__subclasshook__ class 方法定义为 return True

@classmethod
def __subclasshook__(cls, C):
    if cls is Iterable:
        return _check_methods(C, "__iter__")
    return NotImplemented

有两种方法可以使 a 成为 b 的子class。 a 可以继承自 b(或 b 的子 class),或者 b.__subclasshook__(a) 可以 return True.

由于isinstance(a, b)检查type(a)是否是b的子class,它也受到__subclasshook__的定义的影响。