5

在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)?

4

2 回答 2

10

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

该成员子对象保证与完整对象位于同一地址。

PyObject_HEAD*成员子对象上的点,但一旦ob_type被检查以确定完整类型是什么,就可以转换为完整类型。

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

于 2012-07-31T09:33:59.577 回答
2

因为PyObject_HEAD始终是第一个不受具体基础类型影响的结构成员。指针当然会被强制转换。

于 2012-07-31T09:16:45.203 回答