鉴于type
是所有类的超类,为什么isinstance(1, type)
是False
?
我理解这个概念错了吗?
答案 0 :(得分:12)
type
不是所有类的超类。它是所有类的类型(没有自定义元类)。请注意区别:
>>> isinstance(1, int)
True
>>> isinstance(1, type)
False
>>> isinstance(int, type)
True
数字1不是类型的实例。相反,int
类型本身是type
的实例。
编辑:
这些示例可能会对您有所帮助:
>>> isinstance(1, int)
True
>>> issubclass(1, int)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
issubclass(1, int)
TypeError: issubclass() arg 1 must be a class
>>> class Foo(object):
... pass
>>> isinstance(Foo, type)
True
>>> issubclass(Foo, type)
False # Note the difference from the previous!
>>> isinstance(Foo, object)
True
>>> issubclass(Foo, object)
True
>>> isinstance(int, type)
True
>>> issubclass(int, type)
False # Note the difference from the previous!
从您的评论中,您似乎误解了继承的工作原理。作为类型的实例和作为类型的子类(或子类型)之间存在差异。如果对象X是类型A的实例,而类型A是类型B的子类,那么X也是B的实例。但是如果类型A是类型B的实例,那么X不是B的实例。换句话说,子类是传递的,但实例不是。
现实世界的类比将是“物种”和“智人”之间的类比。你可以说“物种”是一种类型而“同性恋者”是这种类型的一个实例;换句话说,“智人”是一个特殊的物种。但是“智人”也是一种类型,而个人就是这种类型的一个实例。例如,巴拉克奥巴马(选择一个着名的例子)是“智人”的一个例子;也就是说,他是一个特别的智人。但巴拉克奥巴马不是物种的例子;他本人不是一个物种。
type
,int
与数字1之间的关系类似。数字1是int
的实例,int
是type
的实例,但这并不意味着1是类型的实例。
答案 1 :(得分:4)
那是因为type
不是所有内置类型的超类型。 object
是。