1. 程式人生 > >Python原始碼剖析----第一章

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的多型性。