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.attr和name [index]这样的东西只是方法调用的语法糖。第一个对应于__setattr__ / __getattr__,第二个对应于 __setitem__ / __getitem __(取决于它们出现的赋值的哪一侧)。
就这样。
分享于:
©2000 Fredrik Lundh