2015/8/28 Python基礎(2):對象

來源:互聯網
上載者:User

標籤:

Python用物件模型來儲存資料。構造任何類型的值都是一個對象。
Python對象都有是三個特性:身份,類型和值

身份是每個對象的唯一身份標識。任何對象都可以用內建函數id()來得到身份。如:

>>> s = 1>>> id(s)38249176

身份可以認為是該對象的地址。

類型是資料以何種方式儲存,可以進行怎樣的操作,遵循怎樣的規則。可以使用內建函數type()來查看。

值就是對象的資料項目。

上面三個特性在對象建立時被賦值,除值以外其他特性都是唯讀。對象的類型是可以改變的,但對於初學者不建議這麼做

Python是用點標記法來訪問屬性的,屬性包括對象的名字等等,最常用的屬性是函數和方法,不過有一些也有資料屬性。含有資料屬性的對象包括(不限於):類、類執行個體、模組、複數和檔案

Python的標準類型有:數字、整型、布爾、長整型、浮點、複數、字串、列表、元組和字典。同時還有如下內建類型:類型(對,類型本身是一種類型)、Null對象、檔案、集合、函數/方法、模組、類。

類型也是一種對象,因為對象的一系列固有行為和特性需要事先定義,我們用類型這種對象來儲存這些資訊。
用內建函數type()可以得到特定對象的類型資訊

>>> type(7)<type ‘int‘>

這裡輸出了<type ‘int‘>,其實並不是簡單告訴這是一個整數這樣的字串,而是一個類型對象,這個對象會輸出一個字串來告訴你他是一個對象。我們可以這樣測試它

>>> type(type(7))

如果這隻是一個字串,它會顯示<type ‘str‘>如果是物件類型,它會顯示<type ‘type‘>

結果是

>>> type(type(7))<type ‘type‘>

 

None,Null對象

這是一個特殊的類型,它只有一個值是None,類似於C的void,沒有任何內建方法,沒有有用的屬性,布爾值總是False

 

同時還有一些用類實現的內部類型,這裡暫不贅述。

標準類型運算子
對象值的比較
比較子來判斷同類型的對象是否相等,返回True或False。運算子有== 、<= 、 >=。多個比較可以在同一行裡進行,這一點和C不同。比較的順序式從左至右

>>> 3 < 4 < 5True>>> 3 < 5 < 4False

大多數語言中會寫成這種形式

>>> 3 < 4 and 4 < 5True>>> 3 < 5 and 5 < 4False

同時,可以用如下的寫法,數學中一般不寫

>>> 3 < 5 > 4True

 

對象身份的比較
這是對值比較的補充,Python也支援對象本身的比較。
用的是如下的語句

a is b

它是用於比較a、b兩個變數是否是指向同樣的對象的。和a == b不相同。

a is b等價於
id(a) == id(b)
有如下的代碼

>>> foo1 = 2.0>>> foo2 = 1.0 + 1.0>>> foo1 == foo2True>>> foo1 is foo2False>>> foo1 = 2.0>>> foo2 = 2.0>>> foo1 is foo2False>>> foo2 = foo1>>> foo1 is foo2True>>> foo3 = 2>>> foo4 = 1 + 1>>> foo3 is foo4True

這裡可以看到foo1和foo2的值是相等的,但它們身份不相等。也就是說並不是來自同一個引用。說明在內部儲存它們時,是各自建立了兩個對象然後引用的。

然後還能看到,當我同時給foo1和foo2賦值2.0後,它們並不相等。是創造了兩個對象,只有將foo1直接賦值給foo2才能使它們指向同一個對象。
從此可以理解Python內部的賦值方式,每一個值進行新對象創造再引用給變數。
但是,如果是對整數,結果就不同。書裡說明:
整數對象和字串對象是不可變對象,所以Python 會很高效的緩衝它們。這會造成我們認為Python 應該建立新對象時,它卻沒有建立新對象的假象。
也就是說,整型和浮點型出現不同的緣故是因為Python高效地緩衝了它們。不過這個緩衝是有範圍的,一定要小心使用。


 

標準類型內建函數
函數 功能
cmp(obj1, obj2)  比較 obj1 和 obj2, 根據比較結果返回整數 i:
       i < 0 if obj1 < obj2
       i > 0 if obj1 > obj2
       i == 0 if obj1 == obj2
repr(obj) 或 `obj` 返回一個對象的字串表示
str(obj) 返回對象適合可讀性好的字串表示
type(obj) 得到一個對象的類型,並返回相應的type 對象

 

repr()返回的是一個對象的“官方”字串表示, 也就是說絕大多數情況下可以通過求值運算(使用eval()內建函數)重新得到該對象,但str()則有所不同。str() 致力於產生一個對象的可讀性好的字串表示,它的返回結果通常無法用於eval()求值, 但很適合用於 print 語句輸出。也就是說 repr() 輸出對 Python 比較友好, 而str()的輸出對人比較友好。雖然如此,很多情況下這三者的輸出仍然都是完全一樣的。所謂的對Python友好和對人友好將會在數值這一部分中提到。

類型工廠函數
Python2.2統一了類型和類,所有的類型也都是類,原來的內建轉換函式如type(),int()都成了工廠函數,也就是說雖然看上去像函數,但實際上是類。調用時是產生了一個類型的執行個體。
關於類部分,由於本人學習的C語言裡沒有過多涉及,等到學習到類部分再做筆記。

儲存模型裡,
有儲存一個或多個值的標量/原子類型,如數值和字串。
有容器類型,如列表、元組、字典。
因為Python沒有char類型,所以字串是一個自我包含的文字類型,不是C中和數組相同的情況。

更新模型,
對象建立後,可以更新值的是更新模型,不允許更改的是不可變對象。列表和字典是可變模型,數字、字串、元組是不可變模型。
這裡面存在理解偏差,數值和字串變數可換,但對象不可更新,每次變換是重新創造了對象。
也就是說每次變換後id()的值都會發生變化。而字典和列表,改變值本身,id()始終不變。

訪問模型,
這種分類是區分資料類型的首要類型。按照訪問我們儲存的資料的方式來分類。有三種訪問方式:直接存取、順序、映射。
直接存取 數字
順序訪問 字串、列表、元組
映射訪問 字典
直接存取不贅述,順序訪問的是序列類型,就是元素從0開始索引順序訪問,一次可以訪問一個或者多個元素。
映射類型類似序列類型的索引屬性,但不適用地址位移量取值,元素是無序存放的,通過一個唯一的key來訪問。是鍵-值集合

分類資料類型的原因一是,Python提供的進階資料,我們要將原始的類型和功能強大的擴充類型區分開,所以需要瞭解分類。二是協助我們搞清每種類型的特點。
通過不同方面來分類的原因是這些資料結構本身的關係是複雜的,需要我們多次分清晰脈絡,讓我們對類型瞭解更深。

Python沒有的類型
char或byte。Python沒有8位的整數。可以用長度為1的字串替代。
指標。Python協助程式員管理記憶體,所以不用訪問指標。通過id()得到的值很接近地址,但是不能操作,所以指標也就沒有用。
沒有短整長整的區別,讓程式員更專註於該乾的事。
也沒有單雙精確度的浮點類型。讓事情更簡單。

2015/8/28 Python基礎(2):對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.