对象CPython声明
Object and type object interface
首先我们先来看看object.h文件中的注释。
简单总结如下:
- 对象分配一般在堆上进行
- 每个对象有一个reference count 引用计数
- 每一个对象有一个
type
来真正表明对象类型 - 对象一旦分配,其在内存的地址就不在改变
- 任何对象可以通过
PyObject *
类型指针访问,PyObject结构只包含引用计数和type类型指针两个字段,实际的对象数据由type类型指针指向,即_typeobject
结构体。
PyObject和PyVarObject
在Python中一切都是对象,CPython通过相应的结构体来实现。而Python中的对象又分为定长和变长两种,在object.h中分别声明了PyObject和PyVarObject两个结构体来表示,代码如下:
|
|
从两个结构体定义可以发现,PyObject嵌套在PyVarObject内,实现了继承关系,任何一个指向Python对象的指针都可以转换为PyObject*
,而任何一个指向Python变长对象的指针都可以转换为PyVarObject*
。
各个字段简要说明:
字段 | 说明 |
---|---|
_PyObject_HEAD_EXTRA | 双向链表结构,用于垃圾回收 |
ob_refcnt | 即引用计数 |
ob_type | 指向类型对象的指针,实现对象真正的_typeobject结构体 |
ob_size | 变长对象中元素的个数,如列表与元素 |
主要结构体
结构体 | 说明 |
---|---|
PyNumberMethods | 数值方法 |
PySequenceMethods | 序列方法 |
PyMappingMethods | 映射方法 |
PyAsyncMethods | 异步方法 |
_typeobject | 类型对象 |
在结构体中,我们可以看见如下代码片段:
对象的一系列方法就是通过这几个指针绑定。
需要留意的几个方法
|
|
|
|