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

时间:2012-07-31 09:13:20

标签: python c

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

2 个答案:

答案 0 :(得分:8)

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

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

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

这个技巧并不是CPython独有的 - 它通常用于在C中实现有限类型的继承。基本上你通过“在开头有一个X”来模拟“是一个X”关系。

答案 1 :(得分:2)

因为PyObject_HEAD始终是第一个不受具体底层类型影响的结构成员。指针将会被铸造出来。