繁体   English   中英

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

[英]What are Python's type "objects" exactly?

我刚刚开始学习 Python。 我发现类型系统有点难以理解。 我有很多问题,但主要是长话短说; 文件指出:

“Python 程序中的所有数据都由对象表示......每个对象都有一个身份、一个类型和一个值。”

没问题。 但除此之外,它并没有真正描述“对象”什么。 例如,文档甚至没有涵盖这些“对象”支持点运算符——从我的 PoV 来看,它们可能是内存数据结构中的一些,除了id()type()等之外,它们还没有向用户公开。但是我收集到的是一些底层元对象接口类似于文档中为类实例类型对象描述的接口。 从一个例子工作:

如果我在类实例“x”上执行此操作:

x.__class__.__name__

我得到了它的类的名称。 我明白那个。 该文档描述了类实例类型对象的__class____name__属性。 如果我这样做[].__class__.__name__我得到“列表”。 同样int(1).__class__.__name__给出“int”。 对我来说,引擎盖下到底发生了什么并不明确,我想澄清一下。 所以我的问题是:

  • 类型类型“对象”和“类实例”类型对象之间的关系是什么?
  • 我可以假设内置类型对象的 ~meta API 与“类实例”类型对象的相同吗?
  • 如果是这样,这个接口是什么,它在哪里记录?
  • 一般来说,什么与内置类型对应的“对象”,它们是如何实现的?

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

  • “类型类型“对象”和“类实例”类型对象之间的关系是什么?”
  • “我可以假设内置类型对象的 ~meta API 与“类实例”类型对象的相同吗?”

它们是相同的,是的,它们共享一个通用 API。 文档将内置类型描述为“对象”,或将类实例描述为“对象”,或将类或其他任何内容描述为“对象”时……他们谈论的是完全相同的语言构造。

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

对象是 Python 中的基础语言特性,它支持与其他 OOPL 非常相似的属性和行为。 所有 Python 对象也有一个类,很像其他基于类的 OOPL。 object类是 Python 中类层次结构的基础。 因此,所有类都是object类的子类,并且所有上述“对象”和object实例都是通过继承的方式。

首先值得明确指出的是,在 Python(2.2 及更高版本)中,“类型”和“类”的含义相同(对于所有意图和目的)。 所以“int”和其余所谓的内置类型是类(当然它们表示为对象)。 例如这个x = int(1)调用int类(对象)来构造一个 int 实例对象 x。

确实可以说 Python 中有两种类型的对象; “类型”对象,或那些代表类型的对象,以及“非类型”对象——那些不代表类型的对象。 但是说有两种类型的整数同样正确; 零,而不是零。 它没有多大意义:Python 中的一切都是一个对象,包括类。 由于类形成一个kind对象,它们都是称为“type”的类的实例。 type 对象也是 type 的一个实例。 请注意,您可以通过检查类对象的 _ bases _ 属性来检查类的继承层次结构。 在所有情况下,它都会回到object类——当然。 有关更多详细信息,请参阅https://www.eecg.utoronto.ca/~jzhu/csc326/readings/metaclass-class-instance.pdf

  • “……这一切记录在哪里?”

嗯,这其实是个好问题。 它应该包含在语言参考数据模型部分,但它有点略过。 对象对象的构造函数, object (有意义)是内置的,并在此处记录了其余的内置函数。 The Python TutorialClasses 一章也涵盖了这个领域。

有点难以理解你在问什么。

类型是一个类的类。 与 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__另一种方式。)

Python 类型是普通对象,就像其他任何东西一样(一切都是对象)。 作为一个类型或一个实例是对象的语义问题,它扮演的角色。

Classtype是一个对象,它保存有关如何构造某种对象以及这种对象可以做什么的信息。

在 Python 3 中,类和类型基本上是一回事。 术语“类”更常用于描述复杂类型(库或用户定义的),而术语“类型”用于描述基本原语(例如整数、字符串、列表)或任何一般类型。

(我不知道某些内置类型的实现是否与用户定义的不同;首先,有几个 Python 解释器可能彼此不同。重要的是在概念上,内置类型和用户-定义的类型没有不同)。

类型(类)的实例是使用其类型对象的信息构造的对象,并且其行为方式与其类型对象通告的方式相同。

实例对象通过__class__属性连接到它们的类型对象(尽管最好使用type()函数来获取对象的类型)。 这个连接是一个对象对另一个对象持有的普通引用,它的实现没有什么特别的,只是解释器会使用这个引用来实现子类化和反射。 有时它甚至可以在运行时改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM