对象(Objects)
所有的python对象拥有这些要素:
- 一个唯一的ID(一个整数,id(x))
- 一个类型(type(x))
- 一些内容
ID无法修改,类型无法修改。一些对象允许更改内容,一些对象不允许更改内容。
进一步介绍对象拥有的特性:
- methods
- names
一些对象拥有允许修改内容的method(修改并替换);一些对象仅有允许访问而不能修改内容的method;一些对象根本没有method。对于那些有method的对象,也不可以修改ID和类型。
一些看起来像attribute assignment和item references只是语法糖。
名字(Names)
名字并不是对象的性质,对象本身并不知道它叫什么。一个对象可以有任意的名字,或者干脆没有名字。
名字生存在命名空间(namespaces),如一个模块的命名空间,一个例子的命名空间或一个函数的局部命名空间。
当调用一个函数或method时,它的命名空间被所调用的参数初始化(名字被函数的参数表所取代,对象是传递的那些)
Assignment
Assignment修改了命名空间,而不是对象。
name = 10 意味着你给「name」命名到局部命名空间,令它代表含有值为10的整数对象。
如果这个名字已经形成了一个代表,assignment替换了原始的名字:
name = 10
name = 20
意味着替换了原来的名字,使它又指向了含有值为20的整数对象。原来的「10」没有受到这次操作的影响,它根本不在乎。
但与之相对的,如果你这么做:
name = [ ]
name.append(1)
首先命名「name」到局部命名空间,使它代表一个空的list对象,这算修改命名空间。接着在这个对象上调用了一个method,要求它自己附加一个整数对象,这算list对象内容的修改,但并没有接触命名空间,也没有接触整数对象。
像name.attr和name[index]只是调用method的语法糖。前者相当于__setattr__/__getattr__,后者相当于__setitem__/__getitem__。