当有人说“Python中的所有内容都是一个对象”时,“事物”是什么意思?“

时间:2015-08-18 22:51:23

标签: python object

我经常看到人们说“Python中的所有内容都是一个对象。”但我还没有看到“事物”的实际定义。这句话会让我相信任何类型的所有令牌也被认为是对象,包括操作符,标点符号,空格等。实际情况如此吗?是否有一种更简洁的方式来说明Python对象究竟是什么?

由于

4 个答案:

答案 0 :(得分:2)

任何可以分配给变量的东西都是对象。

包括函数,类和模块,当然还包括intstrfloatlist以及其他所有内容。它不包括空格,标点符号或运算符。

简而言之,标准库中有operator模块,其中包含实现运算符的函数;那些功能是对象。这并不意味着+*是对象。

我可以继续,但这很简单,非常完整。

答案 1 :(得分: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'>

简而言之,如果您可以按名称引用它,那么它就是一个对象。

答案 2 :(得分:1)

通常意味着大多数事物,例如函数和方法都是对象。模块也是。类(不仅仅是它们的实例)本身就是对象。和int / float / strings是对象。所以,是的,事情往往是Python中的对象。 Cyphase是正确的,我只想提供一些可能不会立即显示为对象的事例。

作为对象,然后可以观察到许多属性,您会考虑特殊情况,其他语言中的内容。虽然__dict__允许在Python中进行任意属性赋值,但在用于大量实例化的内容(例如 int )上经常会丢失。

因此,至少在纯Python对象上,可以发生很多魔法,从内省到动态创建新的之类的东西。

有点喜欢海龟。

答案 3 :(得分:0)

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

  

对象是Python的数据抽象。 Python程序中的所有数据都由对象或对象之间的关系表示。 (从某种意义上说,并且与Von Neumann的“存储程序计算机”模型一致,代码也由对象表示。)

     

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

glossary的定义也较短:

  

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

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

在2.2之前的Python版本中,情况并非如此,这是我们为几乎相同的事物 - 对象,数据,值提供多个单词的原因之一;类型,类......但从那时起,以下几种情况是相同的:

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

......等等。

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

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

  

这句话会让我相信任何类型的所有代币也被认为是对象,包括操作符,标点符号,空格等。实际情况如此吗?

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

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

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

numpy.array(或array.arrayctypes.Structure的元素等内容也有一些明显的模糊性。当您编写a[0] = 3时,3对象不会像array一样存储在list中。相反,numpy存储Python甚至不理解的一些字节,但它可以用来在数组范围的操作中做“3将做的同样的事情”,或者创建3对象的新副本如果你以后要求a[0] = 3

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

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

<子> 2。在封面下,几乎总是有一个字符串对象来表示该名称,存储在代表命名空间的字典或元组中,正如您可以通过调用globals()dir(self)看到的那样。但这不是变量

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

<子> 4。但是,在a[0] = 3中,虽然a[0]不是值a0,但是因为该分配等同于a.__setitem__(0, 3),所以这不是表达。

相关问题