为什么PyObject*可以指向python中的任何对象?

为什么PyObject*可以指向python中的任何对象?,python,c,Python,C,在python的源代码中,有一些宏定义如下: #定义PyObject#u头\ int ob_refcnt\ 结构类型对象*对象类型; #定义PyObject\u VAR\u头\ 皮尤头\ int ob_尺寸; typedef结构_对象{ 皮尤头 }PyObject; typedef结构_对象{ 皮尤头 长期观察; }PyIntObject; 类型定义结构{ PyObject_VAR_头 }PyVarObject; 问题是,为什么PyObject*可以指向python中的每个对象(例如PyInO

在python的源代码中,有一些宏定义如下:

#定义PyObject#u头\
int ob_refcnt\
结构类型对象*对象类型;
#定义PyObject\u VAR\u头\
皮尤头\
int ob_尺寸;
typedef结构_对象{
皮尤头
}PyObject;
typedef结构_对象{
皮尤头
长期观察;
}PyIntObject;
类型定义结构{
PyObject_VAR_头
}PyVarObject;

问题是,为什么PyObject*可以指向python中的每个对象(例如PyInObject、PyVarObject)?

因为
PyObject\u HEAD
始终是不受具体底层类型影响的第一个结构成员。指针当然会被强制转换。

不同类型Python对象的每个结构都有一个
PyObject\u HEAD
的实例作为其第一个成员(或其第一个成员的第一个成员,依此类推)

此成员子对象保证位于与完整对象相同的地址

PyObject\u HEAD*
指向该成员子对象,但在检查
ob\u type
以确定完整类型后,可以将其转换为完整类型


这个技巧不是CPython独有的——它通常用于在C中实现有限类型的继承。基本上,您可以通过“在开始处有一个X”来建模“是一个X”关系。

宏定义中是否缺少一些反斜杠?在我编辑它之后,它现在看起来正确吗?