zg手冊 之 python2.7.7源碼分析(1)-- python中的對象

源代碼主要目錄結構

  1. Demo: python 的示例程序python

  2. Doc: 文檔c++

  3. Grammar: 用BNF的語法定義了Python的所有語法,提供給解析器使用windows

  4. Include: 頭文件,在用c/c++編寫擴展模塊時使用api

  5. Lib: Python自帶的標準庫,用python編寫的app

  6. Modules: 用c編寫的內建模塊的實現,zlib,md5 等python2.7

  7. Objects: 內建對象類型的實現 list,dict 等函數

  8. PC:      windows 平臺相關文件工具

  9. PCbuild: Microsoft Visual C++ 項目工程目錄源碼分析

  10. Parser:  對 Python 代碼進行詞法分析和語法分析的代碼ui

  11. Python:  字節碼編譯器和解釋器

  12. Tools:   一些用 Python 開發的工具


python 的對象定義和建立

在 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' */

  1. 全部類型對象,自定義類對象的類型都是 PyType_Type(python內置的 type 類型),PyType_Type 自己也是一個對象。

  2. 上面的 PyBaseObject_Type 類對象是全部其餘類的基類(python中內置的 object 類型)。PyBaseObject_Type 自己也是一個對象。

  3. 數值/序列/關聯對象的操做方法集合,定義了對象具備這三種對象的操做方法(如數值對象也能夠有 []取值操做)。


對象的建立

類型對象在腳本被執行的時候建立,而且添加到符號表。在須要建立類對象的實例時,從符號表中獲取類型對象,並建立它的實例(在 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()

  1. PyObject_Call 函數被調用,參數是 Test 類對象

  2. 由於繼承自 object, 根據類型對象的類型調用 object類型的 tp_call

  3. tp_call 調用 tp_new,tp_init(對應 python類的 __init__ 初始化構造函數)。


原文連接: zg手冊 之 python2.7.7源碼分析(1)-- python中的對象

相關文章
相關標籤/搜索