【问题标题】:What does "thing" mean when someone says "Everything in Python is an object."?当有人说“Python 中的一切都是对象”时,“事物”是什么意思?
【发布时间】:2015-08-18 22:51:23
【问题描述】:

我经常看到人们说“Python 中的一切都是对象。”,但我还没有看到实际定义的“事物”。这句话让我相信,任何类型的所有标记也都被认为是对象,包括运算符、标点符号、空格等。真的是这样吗?有没有更简洁的方式来说明 Python 对象实际上是什么?

谢谢

【问题讨论】:

  • 听起来你需要学习一些基本的编程概念。你有没有在谷歌上搜索过这个,或者读过书,或者参加过课程?
  • 呃,呃。放慢批评,老虎。运算符的使用,空格让我觉得 OP 确实知道一些编程。
  • 任何不是语法或关键字的东西都是对象。
  • 阅读一些有关 SmallTalk 的资料会派上用场。 SmallTalk 定义了“一切”。

标签: python object


【解决方案1】:

任何可以赋值给变量的都是对象。

这包括函数、类和模块,当然还有 int's、str's、float's、list's 和其他所有内容。它不包括空格、标点符号或运算符。

顺便提一下,标准库中有operator 模块,其中包含实现运算符的函数;这些功能是对象。这并不意味着 +* 是对象。

我可以继续说下去,但这很简单,也很完整。

【讨论】:

  • 我知道这不是对被认为是我正在寻找的 Python 对象的要求的正式定义,但第一句话似乎确实是一个很好的蛮力方法来确定某事是否是一个对象,如果你还不知道的话。
  • @BenevolentDeity,我打算只用第一句话发布它,然后添加最后一句话,然后再添加一点(相对很多),因为我认为有人可能会因为太短而投反对票:) .
【解决方案2】:

有些值显然是对象;它们是类的实例,具有属性等。

>>> i = 3
>>> type(i)
<type 'int'>
>>> i.denominator
1

其他值是不太明显的对象。类型是对象:

>>> type(int)
<type 'type'>
>>> int.__mul__(3, 5)
15

即使type 也是一个对象(type 类型,很奇怪):

>>> type(type)
<type 'type'>

模块是对象:

>>> import sys
>>> type(sys)
<type 'module'>

内置函数是对象:

>>> type(sum)
<type 'builtin_function_or_method'>

简而言之,如果你可以通过名称引用它,它就是一个对象。

【讨论】:

  • 每个函数都是一个对象;内置与否。如果不是这样,我会感到惊讶。
  • 我并不想详尽无遗,尽管我不确定为什么我会选择内置函数而不是用户定义函数。
【解决方案3】:

通常的意思是大多数东西,例如函数和方法都是对象。模块也是。类(不仅仅是它们的实例)本身就是对象。和 int/float/strings 是对象。所以,是的,在 Python 中,事物通常是对象。 Cyphase 是正确的,我只是想给出一些可能不会立即作为对象显而易见的事物的示例。

作为对象,那么在您认为是特殊情况的事物上可以观察到许多属性,这些属性是其他语言中的烘焙内容。虽然 __dict__ 允许在 Python 中进行任意属性分配,但在 int 等用于大容量实例化的东西上经常会丢失。

因此,至少在纯 Python 对象上,可以发生很多神奇的事情,从内省到动态创建新的

一路下来有点像乌龟。

【讨论】:

    【解决方案4】:

    你不会找到像 C++11 那样严格的定义,因为 Python 没有像 C++11 这样的正式规范,它有一个 reference manual 像 pre-ISO C++ 一样。 Data model 章节非常严谨:

    对象是 Python 对数据的抽象。 Python 程序中的所有数据都由对象或对象之间的关系表示。 (在某种意义上,按照冯诺依曼的“存储程序计算机”模型,代码也由对象表示。)

    每个对象都有一个标识、一个类型和一个值。对象的身份一旦创建就永远不会改变;您可能会将其视为对象在内存中的地址。 …

    glossary 也有一个更短的定义:

    任何具有状态(属性或值)和定义行为(方法)的数据。

    确实,Python 中的所有东西都有方法和(其他)属性。即使没有公共方法,也有一组从object 基类继承的特殊方法和值,例如__str__ 方法。


    在 2.2 之前的 Python 版本中并非如此,这也是我们为几乎相同的事物(对象、数据、值)使用多个词的部分原因; type, class... 但是从那时起,以下几种事物是相同的:

    • 对象。
    • 函数可以返回或产生的东西。
    • 可以存储在变量(包括参数)中的东西。
    • object 类型实例的事物(通常是间接地,通过一两个子类)。
    • 可以是表达式产生的值。
    • CPython 中由指向 PyObject 结构的指针表示的事物。

    ……等等。

    这就是“一切都是对象”的意思。

    这也意味着Python没有像Java那样的“原生类型”和“类类型”,或者像C#那样的“值类型”和“引用类型”;只有一种东西,对象。


    这句话让我相信任何种类的所有标记也被认为是对象,包括运算符、标点符号、空格等。真的是这样吗?

    没有。这些东西没有价值,所以它们不是对象。1


    另外,变量不是对象。与 C 风格的变量不同,Python 变量不是具有包含值的类型的内存位置,它们只是绑定到某个命名空间中的值的名称。2 这就是为什么您不能传递引用的原因变量;没有“东西”可以参考。3

    分配目标也不是对象。它们有时看起来很像值,甚至核心开发人员有时也会将 a, b = 1, 2 中的 a, b 松散地称为元组对象,但那里没有元组。4


    对于numpy.array(或array.arrayctypes.Structure)的元素,还有一些明显的模糊性。当您编写a[0] = 3 时,3 对象不会像使用list 那样存储在array 中。相反,numpy 存储了一些 Python 甚至不理解的字节,但它可以用来在数组范围的操作中执行“与 3 相同的事情”,或者制作 3 对象的新副本,如果你稍后请求a[0] = 3

    但是如果你回到定义,很明显这个“虚拟3”不是一个对象——虽然它有类型和值,但它没有标识。


    1。在元级别,您可以编写一个导入钩子,它可以将导入的代码作为字节字符串、解码的 Unicode 字符串、令牌元组列表、AST 节点、代码对象或模块进行操作,所有这些都是对象……但在“正常”级别,在导入的代码中,令牌等不是对象。

    2。在幕后,几乎总是有一个字符串对象来表示该名称,存储在表示命名空间的字典或元组中,如您通过调用globals()dir(self) 所见。但这不是变量的。

    3。闭包单元是一种表示对变量的引用的方式,但实际上,单元本身就是一个对象,不同范围内的变量只是该单元的一种稍微特殊的名称。

    4.然而,在a[0] = 3 中,虽然a[0] 不是一个值,但a0 是,因为这个赋值等价于表达式a.__setitem__(0, 3),只是它不是一个表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 2011-05-25
      • 1970-01-01
      • 2021-07-25
      • 2014-10-17
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多