shi*_*asu 0 python inheritance abc python-3.x
我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:
请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化
所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。
例如,isinstance([], abc.Iterable), 返回True列表,也是如此abc.Sequence,abc.MutableSequence这是有道理的。对于isinstance和issubclass方法,以下内容也是如此。
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 类的任何目的,因此了解更多有关整个过程的目的会很好。
任何形式的帮助将不胜感激。谢谢。
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__。