12.3 对象和可变长度对象类型

C 语言不是像 Python 这样的面向对象语言,C 语言中的对象不会继承其他对象。PyObject 是每个 Python 对象的初始数据段,PyObject * 表示指向 Python 对象的指针。

当定义 Python 类型时,typedef 使用如下两个宏中的一个:

  • PyObject_HEAD (PyObject) 用于简单的类型

  • PyObject_VAR_HEAD (PyVarObject) 用于容器类型。

PyObject 比较简单,它有如下字段:

字段类型用途

ob_refcnt

Py_ssize_t

实例的引用计数器

ob_type

_typeobject*

对象的类型

例如,cellobject 除了基础字段外,声明了一个额外的字段 ob_ref

typedef struct {
    PyObject_HEAD
    PyObject *ob_ref; /* Content of the cell or NULL when empty */
} PyCellObject;

可变长度类型 PyVarObject 扩展了 PyObject 类型,有如下字段:

字段类型用途

ob_base

PyObject

基类型

ob_size

Py_ssize_t

包含的项目数量

例如,int 类型(PyLongObject),定义如下:

struct _longobject {
    PyObject_VAR_HEAD
    digit ob_digit[1];
}; /* PyLongObject */

Last updated