上QQ阅读APP看书,第一时间看更新
0.3.3 对象机制的基石——PyObject
Python的对象机制是基于PyObject拓展开来的。在实际发布的Python中,PyObject的定义非常简单。相关源码(Include/object.h)如下:
// Include/object.h #define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _object *_ob_prev; typedef struct _object { _PyObject_HEAD_EXTRA // 双向链表 垃圾回收 需要用到 Py_ssize_t ob_refcnt; // 引用计数 struct _typeobject *ob_type; // 指向类型对象的指针,决定了对象的类型 } PyObject;
在PyObject的定义中,变量ob_refcnt与Python的内存管理机制有关,它实现了基于引用计数的垃圾收集机制。对于某一个对象A,当有一个新的PyObject*引用该对象时,A的引用计数增加1;当有一个PyObject*被删除时,A的引用计数则减少1。当A的引用计数减少到0时,就可以从堆上删除A,以释放出内存供别的对象使用。
在ob_refcnt之外,我们可以看到ob_type是一个指向_typeobject结构体的指针,这个结构体是一个什么对象呢?实际上,这个结构体对应着Python内部的一种特殊对象,即用来指定一个对象类型的类型对象。这个类型对象将在后面章节详细分析。可以看到,在Python中,对象机制的核心其实非常简单,一个是引用计数,一个是类型信息。
PyObject中定义了每一个Python对象都必须有的内容,这些内容将出现在每一个Python对象所占用内存的最开始的字节中。