6

鉴于这type是所有类的超类,为什么isinstance(1, type)False?我理解这个概念错了吗?

4

2 回答 2

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、和数字 1之间的关系int类似。数字 1 是 的实例int,并且int是 的实例type,但这并不意味着 1 是类型的实例。

于 2012-08-25T17:57:32.110 回答
4

那是因为type不是所有内置类型的超类型。object是。

于 2012-08-25T17:50:41.617 回答