在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)?在
因为
PyObject_HEAD
总是第一个不受具体基础类型影响的结构成员。指针当然会被投射。在不同类型Python对象的每个结构都有一个
PyObject_HEAD
的实例作为其第一个成员(或其第一个成员的第一个成员,依此类推)。在此成员子对象保证与完整对象位于同一地址。在
PyObject_HEAD*
指向该成员子对象,但是一旦检查了ob_type
以确定完整类型是什么,就可以将其转换为完整类型。在这个技巧并不是CPython独有的,它通常用于在C中实现有限种类的继承。基本上,您可以通过“在开始处有一个X”来对“is a X”关系进行建模。在
相关问题 更多 >
编程相关推荐