所有類的基礎(chǔ)
定長(zhǎng)對(duì)象
PyObject
#define PyObject_HEAD \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
// 定長(zhǎng)對(duì)象
typedef struct _object {
PyObject_HEAD
} PyObject;
變長(zhǎng)對(duì)象
PyVarObject
#define PyObject_VAR_HEAD \
PyObject_HEAD \
Py_ssize_t ob_size; /* Number of items in variable part *///即 容器中元素的個(gè)數(shù)
//變長(zhǎng)對(duì)象(例如list等镊辕,多為容器)
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
效果
通過(guò)這樣定義,所有的對(duì)象都具備這樣的元素衔彻,
那么螟左,在對(duì)象的內(nèi)存布局的頭部便都具有了相同的信息頭
那么谈飒,我們便可以使用一個(gè)PyObject*
指針來(lái)引用所有的對(duì)象
類型對(duì)象
當(dāng)然生成一個(gè)對(duì)象需要知道類的長(zhǎng)度等信息
這就需要用到一個(gè)類的對(duì)象PyTypeObject
對(duì)象的創(chuàng)建
一般,python提供了兩種方式來(lái)創(chuàng)建對(duì)象
- 通過(guò)Python C API來(lái)創(chuàng)建
- 通過(guò)類型對(duì)象創(chuàng)建(例如創(chuàng)建int對(duì)象使用的
PyInt_Type
)
Python C API 可以分為兩類
- 泛型的API (AOL Abstract Object Layer)
這類API可以應(yīng)用到所有Python對(duì)象上癌刽,一般以PyObject_***
的形式存在 - 類型相關(guān)的API (COL Concrete Object Layer)
這類API只能作用于特定的類型役首,例如PyInt_FromeLong()
參考
《Python 源碼剖析》