欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python萬物皆對象理解及源碼學習

 更新時間:2022年05月17日 17:16:34   作者:Blanker_711  
這篇文章主要為大家介紹了Python萬物皆對象的源碼學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

萬物皆對象

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

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

>>> a = int
>>> b = 1
>>> id(a)
140734789683952
>>> id(int)
140734789683952
>>> a
<class 'int'>
>>> id(b)
2421963817200
>>> id(1)
2421963817200
>>> b
1

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.4 type和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__)
None

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

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

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

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

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

3 可變對象與不可變對象

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

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

圖示如下:

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

4 變長對象和定長對象

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

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

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

>>> import sys
>>> a = 1
>>> b = 1111111111111111111111111111111111111111111111111111111111
>>> c = 1.0
>>> d = 1.00000000000000000000000000000000000000000000000000000001
>>> sys.getsizeof(a)
28
>>> sys.getsizeof(b)
52
>>> sys.getsizeof(c)
24
>>> sys.getsizeof(d)
24

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

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

5 補充

變量名:我們創(chuàng)建對象時會為對象分配對應(yīng)的內(nèi)存空間,那么我們將變量名和對象綁定時,變量又是如何存儲的呢?

詳見Python源碼學習筆記:Python作用域與名字空間

以上就是Python萬物皆對象理解及源碼學習的詳細內(nèi)容,更多關(guān)于Python對象的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論