Python的类型“对象”到底是什么?

10
我刚开始学习Python。我发现类型系统有点难以理解。我有很多问题,但是主要的问题是:documentation中说明:
“在Python程序中,所有数据都由对象表示...每个对象都有一个标识符、一个类型和一个值。”
没问题。但除此之外,它没有真正描述“对象”是什么。例如,文档甚至没有涵盖这些“对象”支持点运算符——从我的角度来看,它们可能是一些内存数据结构,用户只能通过id()type()等来访问。然而,我了解到有一些潜在的元对象接口类似于文档中描述的class instance类型对象。以一个例子来工作:
如果我在一个类实例“x”上执行以下操作:
x.__class__.__name__

我获取其类的名称,这点我理解。文档描述了“类实例”和“类”类型对象的__class__和__name__属性。如果我执行[ ].__class__.__name__,我会得到"list"。同样,int(1).__class__.__name__给出"int"。我不确定底层发生了什么,我想要澄清。所以我的问题是:
  • 一个“类型”类型的“对象”和“类实例”类型对象之间的关系是什么?
  • 我能否假定内置类型对象的元API与“类实例”类型对象的相同?
  • 如果是这样,这个接口是什么,它在哪里记录?
  • 一般来说,与内置类型对应的“对象”是什么,它们是如何实现的?

在这里,这个问题被形象地描述为鸡生蛋或蛋生鸡的情况:http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html#object-type-example 通过阅读上述链接的内容,您的许多疑问应该会得到解答。 - GodMan
@GodMan 链接已损坏。 - vishless
@vishnuprasanth,看起来域名无法访问。 ¯_(ツ)_/¯ - GodMan
3个回答

14

我将先回答第一、二个问题,然后是第四个,最后是第三个:

  • "type type 'objects' 和 'class instances' type objects 之间的关系是什么?"
  • "我可以假设内置类型对象的 ~meta API 与 'class instance' 类型对象的相同吗?"

它们是相同的,并且是共享一个通用API的。当 documentation 将内置类型描述为"objects",或将类实例描述为"objects",或将类或其他任何东西描述为"object"时,它们都在谈论完全相同的语言结构。

  • "一般来说,“objects”是什么..."

对象是Python中的一种基本语言特性,支持属性和行为,就像其他面向对象编程语言一样。所有Python对象也都有一个类,就像其他基于类的面向对象编程语言一样。object类是Python中类层次结构的基础。因此,所有类都是object类的子类,并且所有上述的"objects"都是object类的实例 - 通过继承方式。

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

在Python中,可以说有两种类型的对象:“类型”对象,即代表类型的对象,和“非类型”对象 - 不属于前一类别的对象。但同样可以说有两种整数类型:零和非零。这并没有太大意义:Python中的所有内容都是对象,包括类。由于类形成了一种“类型”对象,它们都是一个名为“type”的类的实例。类型对象也是类型的实例。请注意,可以通过检查类对象的_ bases _属性来查看类的继承层次结构。在所有情况下,它都会回到 object 类 - 当然了。关于此问题的更多详细信息,请参见https://www.eecg.utoronto.ca/~jzhu/csc326/readings/metaclass-class-instance.pdf
  • “...这些都在哪里记录下来了?”

好的,这实际上是一个很好的问题。它应该在语言参考数据模型部分中涵盖,但有点被忽略了。对象对象的构造函数,即对象(这是有道理的),是一个内置函数,并与其它内置函数一起记录在此处。另外,Python教程类章节也涵盖了这个领域的一些内容。


我认为这是一个很好的答案!有一件事引起了我的注意(但可能有点离题):你说的“有两种类型的整数;零和非零”是什么意思?这是从计算机的角度来看吗? - scjorge
我学到了很多!谢谢!我也喜欢回答者和提问者是同一个人的事实。 - Yibin Lin

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__的方法。)


我提出了三个具体的问题。我已经编辑了帖子,试图使其更清晰。总的来说,我想要澄清所有内置类型都是“对象”的实现方式,并且它们与“类实例”有什么关系,如果有的话,它们在共享接口方面有什么关系?在我阅读的文档中,甚至没有提到这些“对象”支持点运算符,只有在稍后描述“类实例”和“可调用项”时才隐含地介绍。从我的角度来看,当他们说“对象”时,他们可能意味着任何东西 - 这是不明确的。 - spinkus

1
Python类型就像任何其他东西一样是普通对象(一切都是对象)。成为类型或实例取决于对象的语义角色。
类或类型是一个对象,它保存有关如何构建某种对象以及该类对象可以执行什么操作的信息。
在Python 3中,类和类型基本上是相同的。术语“类”更常用于描述复杂类型(库或用户定义),而术语“类型”用于描述基本原语(例如整数、字符串、列表)或任何类型。
(我不知道一些内置类型是否与用户定义的类型不同;首先,有几个Python解释器可能彼此不同。重要的是,在概念上,内置类型和用户定义的类型没有区别)。
类型(类)的实例是使用其类型对象的信息构造的对象,并且按照其类型对象所声明的方式运行的对象。
实例对象通过 __class__ 属性与它们的类型对象相连接(不过最好使用 type() 函数来获取对象的类型)。这个连接是一个普通的引用,一个对象持有对另一个对象的引用,其实现并没有什么特殊之处,只是解释器将使用这个引用来实现子类化和反射。有时甚至可以在运行时更改它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接