关于Python中'object'类和'type'类的查询

1 投票
3 回答
3211 浏览
提问于 2025-04-18 01:45

我有一个关于基于类的面向对象编程(OOP)在动态的Python语言中的问题。下面是一个关于Python类层次结构的图,来自这个链接

class hierarchy

根据这个图,我明白了,Python中的每种数据类型都是一个类。bool类是object类的直接子类。当我们创建一个新的用户定义类(比如Natalie)时,object类将是这个类的最终祖先。类对象(比如intstrobject)本身也是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

3 个回答

-1

在Java中,Object类是所有类的父类,而且只支持单一继承,但在Python中情况并不是这样。

在Java中

这里插入图片描述

在Python3中,在继承Object之前

这里插入图片描述

继承Object之后

这里插入图片描述

所以,当你在Python中创建一个类时,它并不是从Object继承的。Python基本上遵循的是模块化架构,而不是像Java那样的树形结构。

1
print (isinstance(type,object))
print (type.__class__)
print (isinstance(object,type))

我不知道这对你来说是否比对象更有帮助,但这里有一些经验上的证明。

9

你的理解基本上是对的。typeobject 是特别的,因为它们是类型层次结构的基础。所有东西都是 object 的实例。每个类型或类都是 type 的实例。所以 typeobject 的一个实例,而 object 也是 type 的一个实例。

这意味着继承关系实际上不能用树形结构来表示,因为它们之间有一个循环:typeobject 是彼此的实例。这种相互继承通常是不可行的,但在 Python 中,这些基本类型就是这样:它们打破了规则。图示有点误导,因为它显示 typeobject 继承,但反过来却没有。实际上,typeobject 之间的箭头应该是双向的,表示继承是双向的。

区分类型/类是从什么地方“继承”的,以及它们是“实例”什么的,这一点很重要,尽管在那个图示中没有直接表示。一个类或类型(比如 intNatalie)是 object 的一个“子类”,但它是 type 的一个“实例”。你在问题 3 中提到的两个说法与此有关。object 类型是 object 的一个实例,因为所有东西都是对象;object 也是 type 的一个实例,因为 object 是一个类型(也就是一个类)。同样,typeobject 的一个实例,因为所有东西都是对象;而 type 也是 type 的一个实例,因为 type 是一个类型(它是类型的类型,也是用户定义类的类型)。

图示中还有一个不准确的地方:bool 实际上并不是 object 的直接子类,而是 int 的子类(而 intobject 的直接子类)。

撰写回答