Demo: python 的示例程序python
Doc: 文檔c++
Grammar: 用BNF的語法定義了Python的所有語法,提供給解析器使用windows
Include: 頭文件,在用c/c++編寫擴展模塊時使用api
Lib: Python自帶的標準庫,用python編寫的app
Modules: 用c編寫的內建模塊的實現,zlib,md5 等python2.7
Objects: 內建對象類型的實現 list,dict 等函數
PC: windows 平臺相關文件工具
PCbuild: Microsoft Visual C++ 項目工程目錄源碼分析
Parser: 對 Python 代碼進行詞法分析和語法分析的代碼ui
Python: 字節碼編譯器和解釋器
Tools: 一些用 Python 開發的工具
python 中的對象有定長對象PyObject (如 int 對象),變長對象PyVarObject(如 list 對象), Python 的對象都屬於這兩種之一。對象中包含引用計數和類型信息,管理和建立對象須要用到。還包含屬性值的存儲空間。
PyObject 對象在內存中的結構相似下面代碼:
// 在 Include/object.h 中 // 定長對象 typedef struct _object { int ob_refcnt; // 用於內存管理的引用計數 struct _typeobject *ob_type; // 類型對象,包含類型信息 } PyObject; // 變長對象 typedef struct { int ob_refcnt; // 用於內存管理的引用計數 struct _typeobject *ob_type; // 類型對象,包含類型信息 Py_ssize_t ob_size; // 變長對象(容器類: list等)容納元素的個數 } PyVarObject; // int 對象 typedef struct { PyObject_HEAD long ob_ival; } PyIntObject;
在PyObject 的類型對象中(struct _typeobject *ob_type;),有關於類型的名稱,內存佔用大小,構造,析構函數指針等屬性。這些是建立對象所須要的信息。
// 類型對象定義代碼片斷 typedef struct _typeobject { PyObject_VAR_HEAD const char *tp_name; /* 名稱, 打印時輸出的格式 "<module>.<name>" */ Py_ssize_t tp_basicsize, tp_itemsize; /* 建立對象時分配的內存空間大小 */ /* 類型實現的標準方法 */ destructor tp_dealloc; printfunc tp_print; getattrfunc tp_getattr; setattrfunc tp_setattr; cmpfunc tp_compare; reprfunc tp_repr; /* 數值對象的操做方法集合 */ PyNumberMethods *tp_as_number; /* 序列對象的操做方法集合 */ PySequenceMethods *tp_as_sequence; /* 關聯對象的操做方法集合 */ PyMappingMethods *tp_as_mapping; // ... } PyTypeObject; // python 的類的基本類型,全部類型都應該從這個類型繼承 PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */
全部類型對象,自定義類對象的類型都是 PyType_Type(python內置的 type 類型),PyType_Type 自己也是一個對象。
上面的 PyBaseObject_Type 類對象是全部其餘類的基類(python中內置的 object 類型)。PyBaseObject_Type 自己也是一個對象。
數值/序列/關聯對象的操做方法集合,定義了對象具備這三種對象的操做方法(如數值對象也能夠有 []取值操做)。
類型對象在腳本被執行的時候建立,而且添加到符號表。在須要建立類對象的實例時,從符號表中獲取類型對象,並建立它的實例(在 symtable.c 文件中有相關符號表的代碼)。 C api 建立類對象有一套接口:
// 建立一個整型類對象 PyObject* intObj = PyObject_New(PyObject, &PyInt_Type); PyObject *_PyObject_New(PyTypeObject *tp) { PyObject *op; op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); if (op == NULL) return PyErr_NoMemory(); return PyObject_INIT(op, tp); }
在 python 中建立對象時,建立過程以下例描述:
class Test(object): pass objTest = Test()
PyObject_Call 函數被調用,參數是 Test 類對象
由於繼承自 object, 根據類型對象的類型調用 object類型的 tp_call
tp_call 調用 tp_new,tp_init(對應 python類的 __init__ 初始化構造函數)。