天天看點

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__