为什么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 说 list
是 typing.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
我测试了这个简单的代码,发现有些东西让我感到困惑。 运行 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 说 list
是 typing.List
的子 class?
嗯,这就是 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,该列表将其识别为基础 classes,例如:
>>> issubclass(list, collections.abc.MutableSequence)
True
>>> issubclass(list, collections.abc.Collection)
True
>>> issubclass(list, collections.abc.Container)
True