【问题标题】:What are Python's type "objects" exactly?Python 的类型“对象”到底是什么?
【发布时间】:2014-06-05 12:02:10
【问题描述】:

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

"Python 程序中的所有数据都由对象表示...每个 对象具有标识、类型和值。”

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

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

x.__class__.__name__

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

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

【问题讨论】:

  • 这里很好地描述为先有鸡还是先有蛋的情况:cafepy.com/article/python_types_and_objects/… 您的许多疑问应该通过查看上面 URL 的内容来解决
  • @GodMan 链接坏了
  • @vishnuprasanth,似乎无法访问该域。 ¯_(ツ)_/¯

标签: python


【解决方案1】:

我会先回答第 1,2 题,然后是第 4 题,然后是第 3 题:

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

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

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

对象是 Python 中的一个基础语言功能,它支持属性和行为,就像其他 OOPL 一样。所有 Python 对象也有一个类,很像其他基于类的 OOPL。 object 类是 Python 中类层次结构的基础。因此,所有类都是object 类的子类,所有上述“对象”和object 的实例 - 通过继承。

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

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

  • “...全部记录在哪里?”

嗯,这实际上是一个很好的问题。它应该包含在language referenceData Model 部分,但它有点略过。 object 对象的构造函数,object(有意义)是内置的,并与其余的内置函数 here 一起记录。另外The Python TutorialClasses chapter 也涵盖了这个区域。

【讨论】:

  • 我认为这是一个很好的答案!一件事引起了我的注意(但它可能有点跑题了):“有两种类型的整数;零,而不是零”是什么意思?这是从计算机的角度来看的吗?
  • 我学到了很多!谢谢!我也喜欢回答者和提问者是同一个人的事实。
【解决方案2】:

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

类型是类的类。与 Python 中的其他所有内容一样,类本身就是对象,您可以传递它们、将它们分配给变量等。如果您问一个类它的类是什么,您将得到答案type。如果你问一个类instance它的类是什么,你当然会得到这个类。

>>> 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__ 的另一种方式。)

【讨论】:

  • 我问了三个具体问题。我已经编辑了帖子以尝试使其更清晰。一般来说,我要求澄清所有内置类型的“对象”的实现,以及它们与“类实例”的关系,如果有的话,就共享接口而言?在文档中,我读到这些“对象”甚至支持点运算符的事实没有被提及,只是稍后在描述 类实例callables 时才隐式引入。从我的 PoV 来看,当他们说“对象”时,他们可能指的是 任何东西——它的含义是模棱两可的。
【解决方案3】:

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

Class,或type,是一个对象,它包含有关如何构造某种对象以及这种对象可以做什么的信息。

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

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

类型(类)的实例是使用其类型对象的信息构造的对象,其行为方式与其类型对象所宣传的方式相同。

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

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 2020-10-02
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2014-03-23
    • 2012-07-19
    相关资源
    最近更新 更多