Python源碼剖析----第一章

第一章

1.1 Python的內建對象
在python中,對象就是爲C中的結構體在堆上申請的一塊內存,一般不能被靜態初始化
但是,類型對象是唯一的例外,python中所有的內建的類型對象都是被靜態初始化的。
Python中的內建對象的頭結構都是對Pyobject結構的擴展,PyObject是整個Python對象機制的核心。
[object.h]
typedef struct _object{
 int ob_refcnt;#引用計數,用於垃圾收集機制的內存管理
 struct _typeobject *ob_type;#結構體指針,只想對象類型的類型對象
}PyObject;

因此,對於任一個Python內建對象都擁有相同的對象頭部,這就使得在Python中,對對象的引用變得非常統一,我們只需要一個PyObject *指針就可以引用任意的一個對象。


對於每一個對象,除了必須有這個PyObject內容外,還需要一些額外的內存用來存放每個對象各自的信息。
如Python中的整數對象:
[intobject.h]
typedef struct{
 PyObject_HEAD #對象頭結構
 long ob_ival; #整數對象的值
} PyIntObject;

1.2 類型對象
每個對象的元信息如佔用內存大小都與對象所屬類型密切相關,這些信息都由對象所對應的類型對象(_typeobject)來維護。在_typeobject中的定義中包含了許多信息,主要可以分爲四類:
1. 類型名,tp_name, 主要用於Python內部以及調試使用;
2. 創建該類型對象時分配內存空間大小的信息,tp_basicsize, tp_itemsize;
3. 與該類型的對象相關聯的操作信息,如tp_print等的函數指針;
4. ()

類型對象的類型是PyType_Type, 所有用戶自定義class所對應的PyTypeObject對象都是通過這個對象來創建的。以一個整數對象的運行爲例。

通過PyObject和PyTypeObject,Python利用C語言完成了C++所提供對象的多態性。Python創建一個對象會先分配內存,在Python內部會通過泛型指針PyObject *實現各個函數之間的傳遞,從而實現Python的多態性。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章