- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 412字
- 2021-04-30 12:39:31
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 對象運行
推薦閱讀
- JBoss Weld CDI for Java Platform
- React Native Cookbook
- Python從菜鳥到高手(第2版)
- Julia Cookbook
- GeoServer Beginner's Guide(Second Edition)
- Java網絡編程核心技術詳解(視頻微課版)
- PLC應用技術(三菱FX2N系列)
- Android應用案例開發大全(第二版)
- 好好學Java:從零基礎到項目實戰
- Qlik Sense? Cookbook
- C++從入門到精通(第6版)
- Instant Zurb Foundation 4
- Mastering Adobe Captivate 7
- 軟件工程與UML案例解析(第三版)
- 進入IT企業必讀的324個Java面試題