【问题标题】:Query on 'object' class & 'type' class in python在python中查询'object'类和'type'类
【发布时间】:2026-01-20 21:40:01
【问题描述】:

我在命令式/动态 python 语言的基于类的 OOP 范式方面有一个查询。下面是来自link的python类层次结构图。

根据图表,我理解,python 中的每个数据类型都是一个类。 bool 类是 object 类的直接子级。当我们创建一个新的用户定义类(Natalie)时,object 类将成为该类的最终祖先。类对象(int/str/object) 本身就是type 类的实例。在 Java 世界中,我们将其称为“类”类而不是 type 类。

我的问题是:

1) 我的理解正确吗?

2) 如果是,我对从typeobject 类的箭头方向感到困惑。我怎么理解这个?

3) 我无法理解/想象这两个短语(棕色),请帮助我。

the object class is an instance of the type class and itself
the type class is an instance of the object class and itself

【问题讨论】:

  • 这张图有很多问题...
  • 您可以通过查看CPython source 轻松检查所有这些。
  • @arshajii:我认为“轻松”有点言过其实。
  • @BrenBarn 也许吧。无论如何,我认为当涉及到这样的问题时,查看源代码非常有帮助。

标签: python oop


【解决方案1】:

你的理解基本是对的。 typeobject 的特殊之处在于它们是类型层次结构的基础。一切都是object 的一个实例。每个类型/类都是type 的一个实例。所以typeobject 的一个实例,object 也是type 的一个实例。

这意味着继承关系不能真正表示为树,因为有一个循环:typeobject 是彼此的实例。这种相互继承通常是不可能的,但这就是 Python 中这些基本类型的方式:它们打破了规则。该图有点误导,因为它显示type 继承自object,但反之则不然。确实,typeobject 之间的箭头应该是双头的,表示继承是双向的。

区分继承来自什么类型/类以及它们是实例是很重要的,尽管这在该图中没有直接表示。类或类型(如intNatalie)是object子类,但它是type实例。您在问题 3 中提到的两个陈述与此有关。 object 类型是object 的一个实例,因为一切都是对象; object 也是type 的一个实例,因为object 是一个类型(也就是一个类)。同样,typeobject 的一个实例,因为一切都是对象;而type也是type的一个实例,因为type是一个类型(它是类型的类型,也是用户自定义类的类型)。

图中还有一个不准确之处:bool 实际上不是object 的直接子类,而是int 的子类(object 的直接子类)。

【讨论】:

  • brenban 继承是双向的,我怎么理解这个?
  • @Sham:我不明白你在问什么。 “你是怎么理解的”是什么意思?
  • brenban 继承从我在 java 中看到的一般是自上而下的,那么它怎么可能有两种方式呢?
  • @Sham:这就是我要说的。 Python 中这种特殊的继承关系(在typeobject 之间)是特殊的并且违反了常规规则。
  • brenban 您能否也澄清一下我的查询 Q3 中两个语句的含义?自己的实例是什么意思?
【解决方案2】:
print (isinstance(type,object))
print (type.__class__)
print (isinstance(object,type))

我不知道这是否比对象更能帮助你,但有一些经验证明

【讨论】:

  • 这是一个很好的建议。你能澄清一下吗?我得到了 print(type.__class__) 和 print(object.__class__) 的 类型。为什么不是 print(type.__class__) == ?我想如果类型和对象之间的关系是双向的,我们就会得到那个答案。我误解了什么?
【解决方案3】:

在Java中对象类是每个类的超类,单继承是适用的,但在python中则不然。

在 Java 中

在 Python3 中,从对象继承之前

继承对象后

所以当你在 pythyon 中创建一个类时,它不是从对象继承的。它基本上遵循模块化架构。不像 java 的 Tree 结构。

【讨论】: