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

0.3.9 對象的多態性

Python在創建一個對象比如PyLongObject時,會分配內存進行初始化。然后,Python內部會用PyObject*變量來維護這個對象,其他對象與此類似,所以在Python內部各個函數之間傳遞的都是范型指針——PyObject*。如果你不清楚這個指針所指的對象是什么類型,只能通過所指對象的ob_type域動態進行判斷,而Python正是通過ob_type實現了多態機制。

以calc_hash函數為例,相關源碼如下:


Py_hash_t
calc_hash(PyObject* object)
{
    Py_hash_t hash = object->ob_type->tp_hash(object);
    return hash;
}

如果傳遞給calc_hash函數的指針是PyLongObject*,那么它會調用PyLongObject對象對應的類型對象中定義的hash操作tp_hash。tp_hash可以在PyTypeObject中找到,而具體賦值綁定可以在PyLong_Type初始化源碼中看到,其綁定的是long_hash函數:


// Objects/longobject.c
PyTypeObject PyLong_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "int",                                      /* tp_name */
    ...

    (hashfunc)long_hash,                        /* tp_hash */

    ...
};

如果指針是PyUnicodeObject*,就會調用PyUnicodeObject對象對應的類型對象中定義的hash操作。查看源碼,我們可以看到實際綁定的是unicode_hash函數:


// Objects/unicodeobject.c
PyTypeObject PyUnicode_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "str",              /* tp_name */
    ...
    (hashfunc) unicode_hash,        /* tp_hash*/
    ...
};

主站蜘蛛池模板: 图们市| 永定县| 潼南县| 游戏| 石阡县| 宜春市| 澎湖县| 恩平市| 龙江县| 宁明县| 朝阳区| 上饶市| 海晏县| 金门县| 礼泉县| 滁州市| 大姚县| 普洱| 大石桥市| 南康市| 青州市| 四会市| 攀枝花市| 雅安市| 互助| 呼和浩特市| 大理市| 平武县| 双城市| 渝中区| 渝北区| 兴城市| 曲靖市| 长葛市| 怀安县| 佛山市| 建平县| 麻栗坡县| 利辛县| 和林格尔县| 宁远县|