- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 328字
- 2021-04-30 12:39:32
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*/ ... };
推薦閱讀
- 數據結構與算法JavaScript描述
- Web Application Development with MEAN
- Visual Basic程序設計實驗指導(第4版)
- 深入淺出RxJS
- Mastering C++ Multithreading
- 快速入門與進階:Creo 4·0全實例精講
- OpenCV Android Programming By Example
- Hands-On Robotics Programming with C++
- Keil Cx51 V7.0單片機高級語言編程與μVision2應用實踐
- HTML5 Canvas核心技術:圖形、動畫與游戲開發
- Moodle 3.x Developer's Guide
- C/C++程序設計教程
- JavaScript前端開發程序設計教程(微課版)
- Java EE框架開發技術與案例教程
- Sony Vegas Pro 11 Beginner’s Guide