Python进阶编程:编写更高效、优雅的Python代码
上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对象所占用内存的最开始的字节中。