CPython
基于 cpython==3.12.4, 主要结合 微信公众号古明地觉cpython系列 作为参考
// Include/pytypedefs.h
typedef struct _object PyObject;
// Include/object.h
// 这个也就是 python 代码里的 object
// 简化后(主要是去掉了不必要的跨平台的宏, 仅考虑linux x86_64)
struct _object {
union {
Py_ssize_t ob_refcnt; // Py_ssize_t 是指 64 位整数
Py_UINT32_T ob_refcnt_split[2];
};
PyTypeObject *ob_type;
}
// 很多变长对象的实现会在 PyObject 的基础上增加一个属性
typedef struct {
PyObject ob_base;
Py_ssize_t ob_size;
} PyVarObject;
// 以下两个宏很常见
#define PyObject_HEAD PyObject ob_base;
#define PyObject_VAR_HEAD PyVarObject ob_base;
// 例如, python 中的浮点数的实现是用 double 来实现的
// Include/cpython/floatobject.h
typedef struct {
PyObject_HEAD
double ob_fval;
} PyFloatObject;然后再看 PyTypeObject:
宏
将宏展开后, PyTypeObject 实例化的第一个参数是 PyVarObject 类型的, 而 PyVarObject 内部包含 PyObject ob_base; 和 Py_ssize_t ob_size; 两个属性, 在 int 类型中, 后者是 0, 前者应该包含一个 union 类型的引用计数是 _Py_IMMORTAL_REFCNT, 以及一个 *PyTypeObject, 这里是 &PyType_Type.
那么 PyType_Type 是什么呢? 以下定义似乎在定义 PyType_Type 时使用了 PyType_Type, 这是什么原因呢
解释: 这里用的是静态全局变量初始化的特性: 先分配了 MyType_Type 这个实例的地址, 所以在实例化时能使用其自身的地址进行实例化
Last updated
Was this helpful?