python中一切皆物件,包括例項物件和型別物件,如整數、浮點數、字串是例項物件,整數型別、浮點數型別、字串型別是型別物件。
# [python]>>> sys.getsizeof(n)>>> n=10
>>>type(n)
'int
'>
>>> type(int)'
type
'>
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...