gpt4 book ai didi

python - 为什么Python3 typing.List 是list 的子类,而list 又是typing.List 的子类?

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

我测试了这个简单的代码,发现有些东西让我感到困惑。在 Python 3.6 中运行以下代码,两个语句都返回 True。为什么?

import typing
print(issubclass(list, typing.List)) # print True
print(issubclass(typing.List, list)) # print True

有人可以给我一些解释吗?

最佳答案

严格来说,list 不是typing.List 的子类。要查看 list 实际上是什么的子类,您可以查看它的 MRO :

>>> list.__mro__
(<class 'list'>, <class 'object'>)

另一方面,typing.List 的 MRO 表明它实际上是 list 以及许多其他类的子类:

>>> typing.List.__mro__
(typing.List, <class 'list'>, typing.MutableSequence, <class 'collections.abc.MutableSequence'>, typing.Sequence, <class 'collections.abc.Sequence'>, typing.Reversible, <class 'collections.abc.Reversible'>, typing.Collection, <class 'collections.abc.Collection'>, <class 'collections.abc.Sized'>, typing.Iterable, <class 'collections.abc.Iterable'>, typing.Container, <class 'collections.abc.Container'>, typing.Generic, <class 'object'>)

那么,为什么Python说listtyping.List的子类呢?

嗯,这就是 typing.List 的全部意义所在。伪装成 list 的基类。

它是如何完成的?

使用抽象基类。看什么Python doc说到他们:

ABCs introduce virtual subclasses, which are classes that don’t inherit from a class but are still recognized by isinstance() and issubclass(); see the abc module documentation.

从它的 MRO 可以看出,typing.List 继承自许多 ABC,列表将其识别为它的基类,例如:

>>> issubclass(list, collections.abc.MutableSequence)
True
>>> issubclass(list, collections.abc.Collection)
True
>>> issubclass(list, collections.abc.Container)
True

关于python - 为什么Python3 typing.List 是list 的子类,而list 又是typing.List 的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49043989/

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