在python的源代码中,有一些像这样的宏定义:
#define PyObject_HEAD \
int ob_refcnt; \
struct _typeobject *ob_type;
#define PyObject_VAR_HEAD \
PyObject_HEAD \
int ob_size;
typedef struct _object {
PyObject_HEAD
} PyObject;
typedef struct _object {
PyObject_HEAD
long ob_ival;
} PyIntObject;
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
问题是,为什么PyObject *可以指向python中的每个对象(例如PyIntObject,PyVarObject)?
答案 0 :(得分:8)
不同类型的Python对象的每个结构都有PyObject_HEAD
的实例作为其第一个成员(或其第一个成员的第一个成员,依此类推)。
此成员子对象保证与完整对象位于同一地址。
该成员子对象的PyObject_HEAD*
点,但是一旦检查了ob_type
,就可以转换为完整类型,以确定完整类型。
这个技巧并不是CPython独有的 - 它通常用于在C中实现有限类型的继承。基本上你通过“在开头有一个X”来模拟“是一个X”关系。
答案 1 :(得分:2)
因为PyObject_HEAD
始终是第一个不受具体底层类型影响的结构成员。指针将会被铸造出来。