gpt4 book ai didi

python - 列表类如何成为 Python 中 collections.abc.Sequence 的子类?

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:05 24 4
gpt4 key购买 nike

在 Python 中,list 类似乎是 collections.abc.Sequence 的子类(完全有道理):

from collections.abc import Sequence
issubclass(list, Sequence)
# returns True

但是列表类型似乎没有继承自Sequence:

dict.__mro__
# returns (dict, object)

那么,这个 issubclass(list, Sequence) 是如何工作的?它如何返回 True

最佳答案

collections.abc 类型重载了 isinstance()issubclass() 运算符来检查对象是否有预期的接口(interface),没有需要真正的子类化。参见 PEP 3119其中引入了抽象基类;特别是关于 overloading those two functions 的部分更多。这就是 collections.abc 模块的要点。例如,如果您定义自己的类来提供预期的属性,Python 会说它是该类型的实例/子类:

>>> class MyClass:
... __contains__ = 0
...
>>> from collections import abc
>>> issubclass(MyClass, abc.Container)
True

检查某物是否是其他类型的子类或实例的要点通常是检查它是否具有预期的接口(interface)。在这种情况下,MyClass 确实有一个 __contains__ 属性,因此假定它符合接口(interface)。当然在这个例子中它实际上并不符合接口(interface):MyClass.__contains__ 不是一个方法,所以如果你尝试使用一个MyClass()你的程序将会失败> 作为容器的对象。但是,issubclass()isinstance() 会告诉您它是一个容器对象。通常的鸭子打字规则适用。

关于python - 列表类如何成为 Python 中 collections.abc.Sequence 的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57445935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com