在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;
Run Code Online (Sandbox Code Playgroud)
问题是,为什么PyObject*可以指向python中的每个对象(例如PyIntObject,PyVarObject)?
不同类型的Python对象的每个结构都有一个实例PyObject_HEAD作为其第一个成员(或其第一个成员的第一个成员,依此类推).
保证该成员子对象与完整对象位于同一地址.
可以PyObject_HEAD*检查该成员子对象上的点,但是可以将其转换为完整类型,ob_type以确定完整类型是什么.
这个技巧并不是CPython独有的 - 它通常用于在C中实现有限的继承.基本上你通过"在开头有一个X"来模拟"是一个X"关系.
| 归档时间: |
|
| 查看次数: |
1768 次 |
| 最近记录: |