我测试了这个简单的代码,发现有些东西让我困惑。在Python 3.6中运行以下代码,两个语句都返回True。为什么呢?
import typing
print(issubclass(list, typing.List)) # print True
print(issubclass(typing.List, list)) # print True
有人能给我一些解释吗?
答案 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'>)
list
是typing.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