为什么Python3typing.List是list的子类,list又是typing.List的子类?

How come Python3 typing.List is a subclass of list and list is also a subclass of typing.List?

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

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

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

严格来说,list 不是 typing.List 的子class。要查看 list 实际上是一个子 class 的,你可以看看它的 MRO:

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

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

>>> 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 的子 class?

嗯,这就是 typing.List 的重点。假装是 list.

的基础 class

怎么做到的?

使用抽象基础类。看看 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,该列表将其识别为基础 classes,例如:

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