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.Sequence
和 abc.MutableSequence
也是有道理的。对于 isinstance
和 issubclass
方法,以下也是如此。
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__
的定义的影响。
我正在阅读 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.Sequence
和 abc.MutableSequence
也是有道理的。对于 isinstance
和 issubclass
方法,以下也是如此。
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?
我看不出 ABC classes 除了提供一种验证 class 是否包含某些特定 dunder 方法的方法之外的任何目的,因此最好了解更多关于整个过程的目的。
如有任何帮助,我们将不胜感激。谢谢。
__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__
的定义的影响。