Python萬物皆對象理解及源碼學(xué)習(xí)_第1頁
Python萬物皆對象理解及源碼學(xué)習(xí)_第2頁
Python萬物皆對象理解及源碼學(xué)習(xí)_第3頁
Python萬物皆對象理解及源碼學(xué)習(xí)_第4頁
Python萬物皆對象理解及源碼學(xué)習(xí)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第Python萬物皆對象理解及源碼學(xué)習(xí)目錄萬物皆對象1類型對象和實例對象2類型、對象體系2.1元類型type2.2自定義類型2.3自定義類型子類2.4type和object的關(guān)系3可變對象與不可變對象4變長對象和定長對象5補充

萬物皆對象

這篇博客的內(nèi)容主要是針對Python中萬物皆對象的理解,對Python的類型、對象體系做一個整體的梳理。

在Python中,一切皆為對象,一個整數(shù)是一個對象,一個字符串也是一個對象,基本類型(如int)也是對象。Python不再區(qū)別對待基本類型和對象,所有的基本類型內(nèi)部均由對象實現(xiàn)。

a=int

b=1

id(a)

140734789683952

id(int)

140734789683952

class'int'

id(b)

2421963817200

id(1)

2421963817200

1類型對象和實例對象

Python中的類型是一種對象,稱為類型對象。整數(shù)類型、字符串類型,以及我們通過class關(guān)鍵字定義的自定義類型也是一個對象。

通過類實例化可以得到一個實例化對象,稱為實例對象

2類型、對象體系

2.1元類型type

前面我們提到:Python中的類型是一種對象,稱為類型對象。那么類型對象的類型又是什么呢?

type(int)

class'type'

int.__class__

class'type'

可以看到,類型的類型是type,我們稱之為元類型,但是這個類型比較特殊,它的實例對象是類型對象。此外,Python中還有一個特殊的類型object,所有其他類型都繼承于object,即object是所有類型的基類。

圖示如下:

2.2自定義類型

除了Python的內(nèi)置類型,我們自定義一個類型MyClass,同樣地,可以得到:

2.3自定義類型子類

再定義一個類型MySubClass,該類型為MyClass的子類:

2.4type和object的關(guān)系

在上述示例中,我們描述了不同對象、類型之間的繼承、類型關(guān)系,但是對于兩個特殊的類型type和object的關(guān)系并沒有指出,我們先來打印看一下:

type(type)

class'type'

type(object)

class'type'

type.__base__

class'object'

object.__base__

print(object.__base__)

可以看到:object的類型也是type,type本身的類型也是type;而type的父類也是所有對象的父類object,而object本身沒有父類。由此我們可以歸納出:

object是所有類型的基類(除了它自己),本質(zhì)上是一種類型,其類型是type,同時也是type的基類;

type是所有類型的類型,本質(zhì)上是一種類型,其類型是它自己,也是object的類型;

注:object本身不能有基類,這是因為對于存在繼承關(guān)系的類,成員屬性和成員方法查找需要回溯繼承鏈,不斷查找基類。因此,繼承鏈必須有一個終點,不然就會死循環(huán)。

最后我們把type和object的關(guān)系補充進(jìn)來:

3可變對象與不可變對象

可變對象在創(chuàng)建之后,其值可以修改;不可變對象在創(chuàng)建之后,其值不可以進(jìn)行修改。

以Python中的整數(shù)對象為例:整數(shù)類型是不可變類型,整數(shù)對象是不可變對象。修改整數(shù)對象時,Python將以新值創(chuàng)建一個新對象,變量名與新對象進(jìn)行綁定,舊對象如果沒有其他引用,則會被釋放(通過小整數(shù)池進(jìn)行創(chuàng)建回收優(yōu)化,具體后續(xù)介紹,這里先按下不表,后續(xù)會補充)。

圖示如下:

以Python中的列表對象為例:列表類型是可變類型,列表對象是可變對象。列表對象內(nèi)部會維護(hù)一個動態(tài)數(shù)組,存儲元素對象的指針,列表對象再增減對象的時候,會修改該數(shù)組,而列表對象的頭部(后續(xù)會詳細(xì)介紹)會保持不變:

4變長對象和定長對象

定長對象:對象的內(nèi)存大小一定

邊長對象:同一類型,不同對象會有不同的大小

通過sys.getsizeof()可以查看一個對象的大?。?/p>

importsys

a=1

b=1111111111111111111111111111111111111111111111111111111111

c=1.0

d=1.00000000000000000000000000000000000000000000000000000001

sys.getsizeof(a)

sys.getsizeof(b)

sys.getsizeof(c)

sys.getsizeof(d)

整數(shù)對象是變長對象:固定位數(shù)的整數(shù)能夠表示的范圍是有限的,故整數(shù)對象會隨著自身的數(shù)值大小而改變自身內(nèi)存大小。在Python中采用了類似C++中大整數(shù)類的思路實現(xiàn)整數(shù)對象,通過串聯(lián)多個普通32位整數(shù)來支持更大的數(shù)值范圍(詳細(xì)源碼后續(xù)介紹)。

浮點數(shù)對象是定長對象:根據(jù)機(jī)組的知識,我們用32位表示單精度浮點數(shù),用64位表示雙精度浮點數(shù),它們都是定長的。在Python中,浮點數(shù)背后是由一個double來實現(xiàn)的,就算表示很大的數(shù),浮點數(shù)對象的大小也不變(這樣做的代價是犧牲了精度)。當(dāng)然,浮點數(shù)也是有大小限制的,可以思考下:我們通過float()將一個很大的int轉(zhuǎn)化為float時,是否會報錯?Python底層是否做了相應(yīng)的判斷呢?

5補充

變量名:我們創(chuàng)建對象時

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論