CPython 物件 型別系統

2022-08-19 01:24:13 字數 2172 閱讀 6140

python中一切皆物件,包括例項物件和型別物件,如整數、浮點數、字串是例項物件,整數型別、浮點數型別、字串型別是型別物件。

# [python]

>>> n=10

>>>type(n)

'int

'>

>>> type(int)'

type

'>

>>> sys.getsizeof(n)

20>>> sys.getsizeof(int)

444>>>

如演示**所示,整數物件(n)的型別是int(整數型別),整數型別物件的型別是type(型別的型別物件);其中整數物件占用20位元組記憶體,而整數型別物件占用444位元組記憶體[這些數值取決於測試所使用的裝置和系統]

看到占用記憶體的數值大小,一定會非常好奇這些記憶體用來做什麼,後面會貼原始碼來進行說明。物件是資料以及基於這些資料的操作的集合,在python中物件一旦被建立,其在記憶體中的大小就固定不變。

pyobject

pyobject是物件系統的核心,所有的物件都包含這部分資料。它主要包括:用於記憶體管理的引用計數(ob_refcnt)、型別物件指標(ob_type)、堆記憶體中物件管理用的雙向鍊錶指標(_ob_next, _ob_prev)[總共16位元組]。

其中ob_type指向物件所屬的型別物件,而型別物件是有定義操作集合的,所以在執行時通過ob_type找到合適的操作(函式呼叫),實現了python的動態機制。

//

[c]typedef struct

_object pyobject;

pyvarobject

整數物件、浮點數物件是定長的,而字串物件是變長的,取決於字串長度,這種變長物件用pyvarobject結構體來表示。

//

[c]typedef struct

pyvarobject;

相對於pyobject,定長物件只增加了變長物件的大小字段(ob_size)。

pyobject和pyvarobject的資料中,都有指向型別物件的指標,型別物件是_typeobject結構體,即pytypeobject。

pytypeobject

標準操作:釋放記憶體(tp_dealloc)、列印(tp_print)、獲取屬性(tp_getattr)、設定屬性(tp_setattr)、比較(tp_compare)。

//

[c]typedef struct

_typeobject pytypeobject;

注:像cmpfunc是定義的函式指標,其它的函式指標也有類似的定義。

typedef int (*cmpfunc)(pyobject *, pyobject *); // 比較兩個pyobject物件的函式指標

在python中,一般來說物件是不能被靜態初始化的也不能在棧空間生存。但內建資料型別的物件都是被靜態初始化的,如pyint_type、pyfloat_type、pystring_type等,其中pyint_type的初始化**如下:

//

[c]pytypeobject pyint_type =;

注:pytype_type是型別的型別。

說完了內建資料型別,那自定義型別在python中是如何表示的呢?

自定義class演示**如下:

#

[python]

>>> class

a(object):

...

def__init__

(self):

...

pass

...>>> a.__class__

'type

'>

>>> type.__class__

'type

'>

可以看到自定義class的型別物件是pytype_type,即用pytype_type物件來建立自定義的型別物件。

pytype_type的初始化**如下:

//

[c]pytypeobject pytype_type =;

自此把例項物件、型別物件基本講清楚了,至於具體型別的實現、特性則需要後續再具體講解。

Object C 系統型別物件歸檔

系統型別主要是指nsstring nsdictionary,nsarray,nsdata,nsnumber 型別資料 包括對應可變型別 這些型別已經實現了nscoding協議,支援歸檔,寫入方法 writetofile atomically 讀取方法 dictionarywithcontentsof...

python物件型別 Python物件型別

因為python3.0與python2.x在語法等方面還是有一定的差別,而我的系統中裝的是python2.7,因此筆記基本已python2.7版本為主。python 中的變數是動態的,而非靜態的。意思就是說,在變數賦值之前無需進行變數型別的定義,賦給變數什麼型別,它就是什麼型別的。事實上,在pyth...

物件與型別

結構 struct 在記憶體中的儲存地點是 棧 stack 類 class 在記憶體中的儲存地點是 堆 heap 示例 struct retangle public double width public double height public retangle double width,doub...