在Python中, 万物皆对象,而所有对象的共性内容都被定义在PyObject中。PyObject可谓是Python对象机制的基石。
本文将简要介绍Python对象机制的实现, 以及其涉及的数据结构和原理。
对象机制基石-PyObject
在介绍Python对象之前,首先有必要介绍一下PyObject
和PyVarObject
的定义。通过typedef定义了结构体_object
新的数据类型名: PyObject
,而PyObject
的核心定义在宏PyObject_HEAD
。而PyVarObject
实际是在PyObject_HEAD
的基础上增加了变长数量ob_size
字段。
1234567891011
// [object.h]// 1. 指向定长python object对象的指针都可以转换为PyObject* // 2. 指向变长python object对象的指针都可以转换为PyVarObject*typedef struct _object { PyObject_HEAD} PyObject;typedef struct { PyObject_VAR_HEAD} PyVarObject;
123456789101112131415161718192021222324252627282930
// PyObject_HEAD 定义/* PyObject_HEAD defines the initial segment of every PyObject. */#define PyObject_HEAD \ _PyObject_HEAD_EXTRA \ Py_ssize_t ob_refcnt; \ struct _typeobject *ob_type;// PyObject_VAR_HEAD 定义/* PyObject_VAR_HEAD defines the initial segment of all variable-size * container objects. These end with a declaration of an array with 1 * element, but enough space is malloc'ed so that the array actually * has room for ob_size elements. Note that ob_size is an element count, * not necessarily a byte count. */#define PyObject_VAR_HEAD \ PyObject_HEAD \ Py_ssize_t ob_size; /* Number of items in variable part */// _PyObject_HEAD_EXTRA 定义#ifdef Py_TRACE_REFS/* Define pointers to support a doubly-linked list of all live heap objects. */#define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _object *_ob_prev;#define _PyObject_EXTRA_INIT 0, 0,#else#define _PyObject_HEAD_EXTRA#define _PyObject_EXTRA_INIT#endif
在release模式编译Python, 数据类型名PyObject定义如下:
12345678
/* * _typeobject: Python内部一种特殊对象, 用来指定对象类型的类型对象 * ob_refcnt: Python使用基于引用计数的垃圾回收机制 */typedef struct _object { Py_ssize_t ob_refcnt; // 引用计数 struct _typeobject *ob_type; // 指向结构体对象类型的类型对象指针} PyObject;
- 对象类型
- 定长对象vs变长对象