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

0.3.8 對象的行為

PyTypeObject中定義了大量的函數(shù)指針。這些函數(shù)指針可以視為類型對象中所定義的操作,這些操作直接決定著對象在運行時所表現(xiàn)出的行為,比如PyTypeObject中的tp_hash指明了該類型對象如何生成其hash值。

在PyTypeObject的源碼中,可以看到非常重要的3組操作族:PyNumberMethods*tp_as_number、PySequenceMethods*tp_as_sequence、PyMappingMethods*tp_as_mapping。

PyNumberMethods的源碼(Include/object.h)如下:


// Include/object.h
typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);

typedef struct {
    binaryfunc nb_matrix_multiply;
    binaryfunc nb_inplace_matrix_multiply;

    ......
} PyNumberMethods;

PyNumberMethods定義了數(shù)值對象該支持的操作。數(shù)值對象如果是整數(shù)對象,那么它的類型對象PyLong_Type中的tp_as_number.nb_add就指定了其進行加法操作時的具體行為。

在以下源碼中,我們可以看出PyLong_Type中的tp_as_number指向的是long_as_number:


// Objects/longobject.c
static PyNumberMethods long_as_number = {
    (binaryfunc)long_add,       /*nb_add*/
    (binaryfunc)long_sub,       /*nb_subtract*/
    (binaryfunc)long_mul,       /*nb_multiply*/
    ......
};

PyTypeObject PyLong_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "int",                                      /* tp_name */
    offsetof(PyLongObject, ob_digit),           /* tp_basicsize */
    sizeof(digit),                              /* tp_itemsize */
    long_dealloc,                               /* tp_dealloc */
    0,                                          /* tp_print */
    0,                                          /* tp_getattr */
    0,                                          /* tp_setattr */
    0,                                          /* tp_reserved */
    long_to_decimal_string,                     /* tp_repr */
    &long_as_number,                            /* tp_as_number */
    0,                                          /* tp_as_sequence */
    0,                                          /* tp_as_mapping */
    ......
};

PySequenceMethods和PyMappingMethods的分析與PyNumberMethods相同,分別定義了作為序列對象和關(guān)聯(lián)對象應該支持的行為。這兩種對象的典型例子是list和dict,大家可以自行查閱源碼。

一種類型可以同時定義3個函數(shù)族中的所有操作。換句話說,一個對象可以既表現(xiàn)出數(shù)值對象的特性,也可以表現(xiàn)出關(guān)聯(lián)對象的特性。

主站蜘蛛池模板: 海宁市| 乌什县| 台州市| 泗洪县| 田东县| 西和县| 冕宁县| 庄浪县| 达尔| 卢湾区| 信阳市| 南澳县| 五指山市| 阳新县| 广饶县| 滁州市| 阿荣旗| 香港| 钦州市| 玉屏| 马公市| 日土县| 临武县| 壶关县| 岑溪市| 樟树市| 土默特右旗| 固镇县| 黔南| 十堰市| 合水县| 丹阳市| 达州市| 朔州市| 汝南县| 陆良县| 防城港市| 上杭县| 益阳市| 黔江区| 廊坊市|