Python 基础对象结构

所有类的基础

定长对象

PyObject

#define PyObject_HEAD                   \
    _PyObject_HEAD_EXTRA                \
    Py_ssize_t ob_refcnt;               \
    struct _typeobject *ob_type;

// 定长对象
typedef struct _object {
    PyObject_HEAD
} PyObject;

变长对象

PyVarObject

#define PyObject_VAR_HEAD               \
    PyObject_HEAD                       \
    Py_ssize_t ob_size; /* Number of items in variable part *///即 容器中元素的个数


//变长对象(例如list等,多为容器)
typedef struct {
    PyObject_VAR_HEAD
} PyVarObject;

效果

通过这样定义,所有的对象都具备这样的元素,
那么,在对象的内存布局的头部便都具有了相同的信息头
那么,我们便可以使用一个PyObject* 指针来引用所有的对象

Python 基础对象结构_第1张图片
内存结构

类型对象

当然生成一个对象需要知道类的长度等信息
这就需要用到一个类的对象PyTypeObject

对象的创建

一般,python提供了两种方式来创建对象

  1. 通过Python C API来创建
  2. 通过类型对象创建(例如创建int对象使用的PyInt_Type)

Python C API 可以分为两类

  1. 泛型的API (AOL Abstract Object Layer)
    这类API可以应用到所有Python对象上,一般以PyObject_***的形式存在
  2. 类型相关的API (COL Concrete Object Layer)
    这类API只能作用于特定的类型,例如PyInt_FromeLong()

参考

《Python 源码剖析》

你可能感兴趣的:(Python 基础对象结构)