Python对象

Python对象

2000年12月12日| 弗雷德里克伦德

简介  

重置你的大脑。

对象  

所有Python对象都有:

  • 唯一标识(由id(x)返回的整数
  • 一个类型(由类型(x)返回
  • 一些内容

你无法改变身份。

您无法更改类型。

某些对象允许您更改其内容(不改变标识或类型)。

某些对象不允许您更改其内容(更多信息如下)。

该类型由一个类型对象表示,它更了解这种类型的对象(它们通常占用多少字节的内存,它们有什么方法等)。

更新:在CPython 2.2及更高版本中,您可以在一些相当有限的情况下更改类型。)

更多关于对象  

对象也可能有:

  • 零个或多个方法(由类型对象提供)
  • 零个或多个名字

某些对象具有允许您更改对象内容的方法(在适当的位置进行修改)。

某些对象只有允许您访问内容的方法,而不是更改它。

有些对象根本没有任何方法。

即使他们有方法,你也永远不能改变类型,也不能改变身份。

属性赋值和项目引用之类的东西只是语法糖(更多信息如下)。

姓名  

名称有点不同 - 它们不是对象的真正属性,对象本身不知道它的名称。

一个对象可以有任意数量的名称,或者根本没有名称。

名称存在于名称空间中(例如模块名称空间,实例名称空间,函数的本地名称空间)。

命名空间是(名称,对象引​​用)对的集合(使用字典实现)。

当您调用函数或方法时,其命名空间将使用您调用它的参数进行初始化(名称取自函数的参数列表,对象是您传入的对象)。

作业  

赋值语句修改名称空间,而不是对象。

换一种说法,

name = 10

表示您将名称“name”添加到本地名称空间,并使其引用包含值10的整数对象。

如果名称已存在,则分配将替换原始名称:

name = 10 
name = 20

意味着您首先将名称“name”添加到本地名称空间,并使其引用包含值10的整数对象。然后,您将替换名称,使其指向包含值20的整数对象。原始的“10”对象不受此操作的影响,并且不关心。

相反,如果您这样做:

name = [] 
name.append(1)

您首先将名称“name”添加到本地名称空间,使其引用空列表对象。这会修改名称空间。然后,您在该对象上调用一个方法,告诉它将一个整数对象附加到自身。这会修改列表对象的内容,但它不会触及命名空间,也不会触及整数对象。

name.attrname [index]这样的东西只是方法调用的语法糖。第一个对应于__setattr__ / __getattr__,第二个对应于 __setitem__ / __getitem __(取决于它们出现的赋值的哪一侧)。

就这样。

分享于:http://effbot.org/zone/python-objects.htm

版权所有 ©2000 Fredrik Lundh

原文地址:https://www.cnblogs.com/Xingtxx/p/11044208.html