Python的类型“对象”究竟是什么?

10 投票
3 回答
20118 浏览
提问于 2025-04-18 03:35

我刚开始学习Python,发现类型系统有点难理解。我有很多问题,但主要是想简单明了地说一下:文档中提到:

“Python程序中的所有数据都是通过对象来表示的……每个对象都有一个身份、一个类型和一个值。”

这没问题。但除了这点,文档并没有详细说明“对象”到底是什么。例如,文档甚至没有提到这些“对象”支持点操作符——在我看来,它们可能只是一些在内存中的数据结构,用户只能通过 id()type() 等函数来接触到它们。不过我了解到,文档中提到的“类实例”类型对象有一些底层的元对象接口,可能和这个类似。举个例子:

如果我在一个类实例“x”上这样做:

x.__class__.__name__

我能得到它的类名。我明白这一点。文档中描述了 __class____name__ 属性,分别对应于 类实例 类型对象。如果我这样做 [].__class__.__name__,我得到“list”。同样, int(1).__class__.__name__ 会给我“int”。但我对底层到底发生了什么还是有些模糊,我想要一些澄清。所以我的问题是:

  • type 类型的“对象”和“类实例”类型的对象之间有什么关系?
  • 我可以假设内置类型对象的~元API和“类实例”类型对象的API是一样的吗?
  • 如果是的话,这个接口是什么,在哪里有文档?
  • 一般来说,和内置类型对应的“对象”到底是什么,它们是如何实现的?

3 个回答

1

在Python中,类型其实就是普通的对象,就像其他任何东西一样(所有东西都是对象)。一个对象是类型还是实例,主要看它的用途和角色。

,或者说类型,是一个对象,它包含了如何构造某种类型对象的信息,以及这种对象可以做些什么。

在Python 3中,类和类型基本上是一样的。通常我们用“类”这个词来描述复杂的类型(比如库里的类型或者用户自己定义的类型),而“类型”这个词则用来描述基本的原始类型(例如整数、字符串、列表)或者一般的任何类型。

(我不太确定一些内置类型的实现方式是否和用户定义的类型不同;首先,市面上有好几种Python解释器,它们可能会有所不同。重要的是,从概念上讲,内置类型和用户定义类型没有区别。)

一个实例是通过其类型对象的信息构造出来的对象,它的行为符合其类型对象所描述的特性。

实例对象通过__class__属性与它们的类型对象相连接(不过用type()函数来获取对象的类型会更好)。这种连接就是一个对象对另一个对象的普通引用,除了这个引用会被解释器用来实现子类化和反射外,没有什么特别的地方。有时候,这种连接甚至可以在运行时改变。

2

你问的问题有点难懂。

类型就是类的类别。在Python中,类本身也是对象,你可以像对待其他对象一样使用它们,比如传递、赋值给变量等等。如果你问一个类它的类别是什么,答案就是 type。如果你问一个类的 实例 它的类别是什么,那当然会得到这个类的名字。

>>> type(int)
<type 'type'>
>>> type(1)
<type 'int'>

>>> class Foo(object):
...   pass
>>> type(Foo)
<type 'type'>
>>> obj = Foo()
>>> type(obj)
<class '__main__.Foo'>

(这里的 函数 type(x) 是另一种获取 x.__class__ 的方式。)

17

我先回答第1和第2个问题,然后是第4个,最后是第3个:

  • “‘对象’类型和‘类实例’类型对象之间有什么关系?”
  • “我可以假设内置类型对象的~meta API和‘类实例’类型对象的API是一样的吗?”

它们是一样的,没错,它们共享一个共同的API。当文档提到内置类型是“对象”,或者类实例是“对象”,或者类本身是“对象”时……它们指的都是同一种语言结构。

  • “一般来说,什么是‘对象’……”

对象是Python中的一个基础语言特性,支持属性和行为,和其他面向对象编程语言(OOPL)类似。所有Python对象都有一个类,和其他基于类的OOPL一样。object类是Python类层次结构的基础。因此,所有类都是object类的子类,所有前面提到的“对象”和object的实例都是通过继承而来的。

首先要明确的是,在Python(2.2及以上版本)中,“类型”和“类”实际上是同一个意思(在大多数情况下)。所以“int”和其他所谓的内置类型都是类(当然它们也被表示为对象)。例如,x = int(1) 这行代码调用了int类(对象)来构造一个int实例对象x。

可以说,Python中有两种类型的对象;“类型”对象,或者说代表类型的对象,以及“非类型”对象——那些不代表类型的对象。但同样可以说,有两种整数;零和非零。这并没有太大意义:在Python中,所有东西都是对象,包括类。由于类形成了一种对象,它们都是一个叫“type”的类的实例。类型对象本身也是类型的一个实例。注意,你可以通过检查类对象的_bases_属性来查看类的继承层次结构。在所有情况下,它最终都指向object类——当然是这样。有关更多细节,请参见这个链接

  • “……这些内容在哪里有文档?”

这个问题问得很好。应该在数据模型部分的语言参考中有所涉及,但实际上只是简单提了一下。对象对象的构造函数object(这听起来有道理)是内置的,并与其他内置函数一起在这里有文档说明。此外,《类章节》《Python教程》中也稍微涉及了一下这个领域。

撰写回答