官术网_书友最值得收藏!

0.3.6 類型的類型

PyTypeObject對象定義中,第一行是宏PyObject_VAR_HEAD。查看源碼可知PyType-Object是一個變長對象,相關源碼(Include/object.h)如下:


// Include/object.h 
#define PyObject_VAR_HEAD      PyVarObject ob_base;

對象的類型是由該對象指向的類型對象決定的,那么類型對象的類型是由誰決定呢?我們可以通過與其關聯的類型對象確定類型。那么,如何來確定一個對象是類型對象呢?答案就是PyType_Type。

PyType_Type相關源碼(Objects/typeobject.c)如下:


// Objects/typeobject.c
PyTypeObject PyType_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "type",                                   /* tp_name */
    sizeof(PyHeapTypeObject),                 /* tp_basicsize */
    sizeof(PyMemberDef),                      /* tp_itemsize */

    ......
};

PyType_Type在類型機制中至關重要,所有用戶自定義class所對應的PyTypeObject對象都是通過PyType_Type創建的。

現在看看PyLong_Type是怎么與PyType_Type建立聯系的。前面提到在Python中,每一個對象都將自己的引用計數、類型信息保存在開始的部分。為了方便對這部分內存初始化,Python中提供了有用的宏。相關源碼(Include/object.h)如下:


// Include/object.h
#ifdef Py_TRACE_REFS
    #define _PyObject_EXTRA_INIT 0, 0,
#else
    #define _PyObject_EXTRA_INIT
#endif

#define PyObject_HEAD_INIT(type)        \
    { _PyObject_EXTRA_INIT              \
    1, type },

這些宏在各種內置類型對象的初始化中被大量使用。以PyLong_Type為例,我們可以清晰地看到一般的類型對象和PyType_Type之間的關系。

相關源碼(Objects/longobject.c)片段如下:


// Objects/longobject.c

PyTypeObject PyLong_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "int",                                      /* tp_name */
    offsetof(PyLongObject, ob_digit),           /* tp_basicsize */
    sizeof(digit),                              /* tp_itemsize */

    ......
};

對象運行如圖0-5所示。

圖0-5 對象運行

主站蜘蛛池模板: 奉新县| 鹤岗市| 台北县| 图片| 佛冈县| 高尔夫| 景德镇市| 天祝| 金湖县| 新蔡县| 常德市| 西华县| 吉水县| 互助| 陇南市| 离岛区| 瑞金市| 泰来县| 济南市| 临安市| 海盐县| 古交市| 长子县| 页游| 普格县| 连平县| 苍山县| 河北省| 纳雍县| 青神县| 哈尔滨市| 隆尧县| 黎平县| 巴林右旗| 阳泉市| 洪江市| 花莲县| 吉木萨尔县| 涟源市| 杂多县| 庄河市|