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

2024-06-26 15:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 定义object源代码varheadstructintpyobject
2条回答

因为PyObject_HEAD总是第一个不受具体基础类型影响的结构成员。指针当然会被投射。在

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

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

PyObject_HEAD*指向该成员子对象,但是一旦检查了ob_type以确定完整类型是什么,就可以将其转换为完整类型。在

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

相关问题 更多 >