PYTHON 原始碼閱讀 - 型別

wklken發表於2015-11-24

這篇主要涉及Python物件的型別機制

有點繞, 一定要思維清晰的時候再看哦:)


一個例子

我們反向推導一個int物件是怎麼生成的.


1. 首先, 定義一種型別叫PyTypeObject

程式碼位置 Include/object.h

定義

說明

所有Type都是PyTypeObject的”例項”: PyType_Type/PyInt_Type


2. 然後, 用PyTypeObject初始化得到一個物件PyType_Type

程式碼位置 Objects/typeobject.c

定義

說明

結構

第一張圖, 箭頭表示例項化(google doc用不是很熟找不到對應型別的箭頭)
PyType_Type

第二張圖, 箭頭表示指向
PyType_Type2

使用

注意: 無論任何時候, ob_type指向的是 PyTypeObject的例項: PyType_Type/PyInt_Type…


3. 再然後, 定義具體的型別, 這裡以PyInt_Type為例子

程式碼位置 Objects/intobject.c

定義

說明

結構

PyType_Type2

使用


4. 最後, 生成一個整數物件int

程式碼位置 Include/intobject.h

定義

結構

PyType_Type2


到這裡, 總結下


多型是如何實現的?

物件的多型, 例如hash

從上面資料結構可以看到, 方法及屬性, 在不同Type例項化時就確定了

Python內部傳遞的是泛型指標PyObject *, 函式呼叫時, 找到其型別* ob_type, 然後呼叫

即: 大量函式指標決定了該型別的具體行為


changelog

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

PYTHON 原始碼閱讀 - 型別 PYTHON 原始碼閱讀 - 型別

相關文章