为什么Python3 typing.List是list的子类,list也是typing.List的子类?

时间:2018-03-01 06:42:53

标签: python list typing

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

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

有人能给我一些解释吗?

1 个答案:

答案 0 :(得分:3)

严格地说,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引入了虚拟子类,而不是类   继承自类,但仍被isinstance()和   issubclass();请参阅abc模块文档。

您可以从其MRO中看到typing.List从许多ABC继承,该列表识别为其基类,例如:

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