天天看点

python 对象基本概念Python Objects

Python Objects

<!-- yui-g -->

December 12, 2000 | Fredrik Lundh, 翻译 jimi.chan

介绍

重新认识python的一切皆对象的概念

Objects 

所有的ptyhon对象都包含如下几个属性:

  • 一个唯一标识符 (一个整数, 可以通过 id(x) 返回这个整数 )
  • 类型(type) (可以通过 type(x) 得到)
  • 其他一些内容

你不能改变一个对象的 唯一标识 和 它的类型

一些对象允许你修改其他属性。但也有一些对象是不让你改变任何东西的。

一个对象的类型是由一个叫 type的对象表示的,这个type对象知道所有关于该对象的事情,包括内存位置已经具有哪些方法等等。

(Update: In CPython 2.2 and later, you can change the type under some rather limited circumstances .)

关于对象更多介绍

对象往往包含:

  • 一个或多个方法(有它的type对象提供)
  • 一个或多个Name

一些对象可以通过它的方法来修改其内容。而一些对象仅仅只允许通过方法来访问其内容。更有一些对象连一个方法都没有。

尽管对象有方法,但是你还是不能修改类型和标识。想属性赋值和对象引用只不过是语法糖而已。

Names 

名字和上面介绍的很大的区别在于,它们不是对象的属性 ,而且连对象自己也不知道它们自己叫什么名字

一个对象可以拥有任意个数量的名字或者一个都没有。Name 是存放在命名空间(namespaces)里面的(比如module namespace, 一个instance namespace命名空间,一个function's local 命名空间)

命名空间一个键值对Dictionaries,key可以是一写 name ,object reference 。

当你调用一个函数或一个方法的时候,他的命令空间就开始使用你调用这个它的参数列表来初始化了。

When you call a function or a method, its namespace is initialized with the arguments you call it with (the names are taken from the function’s argument list, the objects are those you pass in).

赋值 

赋值语句只是修改了命名空间,而不对对象本省

换句话说,

foo= 10

意味着你在local 命名空间里面增加了一个 名字叫 “foo”名字,而且让他指向了值为10的整数对象。

如果该名字已经存在了,那么赋值语句将替换原来的名字(就是命令空间的字典里面又put了一个key,替换了原来的):

foo= 10

foo= 20

就意味着你第一次增加了一个名为“foo”到local命名空间里面去,而且让他指向一个数值为10的整数对象。当执行对二个语句时,python所做的是在命名空间里面替换了‘foo’,并使之指向了数值为10的整数对象。原来的10这个整数对象并没有被改变,何况它也不关心这个变化。

对照:如果你这样写:

name = []

name.append(1)

你第一次是修改了命名空间,而第二句并没有。

像name.attr 和 name[index] 只是个方法调用的语法糖而已。就相当于__setattr__和 __getattr__。第二个对应的是 __setitem__和 __getitem__