ITPub博客

首页 > 应用开发 > Python > Python对象模型的布局

Python对象模型的布局

原创 Python 作者:raptors 时间:2025-11-12 16:19:55 0 删除 编辑

# Python对象模型的布局


Python的对象模型是其核心设计之一,它定义了Python中所有对象的内部结构和行为方式。以下是Python对象模型的主要布局和组成部分:


## 1. PyObject结构体


所有Python对象的基类,定义在`Include/object.h`中:


```c

typedef struct _object {

    _PyObject_HEAD_EXTRA  // 用于调试的双向链表指针

    Py_ssize_t ob_refcnt; // 引用计数

    PyTypeObject *ob_type; // 类型指针

} PyObject;

```


## 2. 可变大小对象 (PyVarObject)


对于可变大小的对象(如列表、字符串等):


```c

typedef struct {

    PyObject ob_base;

    Py_ssize_t ob_size; // 元素数量

} PyVarObject;

```


## 3. 类型对象 (PyTypeObject)


类型对象本身也是一个对象,它定义了对象的行为:


```c

typedef struct _typeobject {

    PyObject_VAR_HEAD

    const char *tp_name; // 类型名称

    Py_ssize_t tp_basicsize, tp_itemsize; // 分配大小信息

    

    // 大量的方法指针和操作函数

    destructor tp_dealloc;

    printfunc tp_print;

    getattrfunc tp_getattr;

    setattrfunc tp_setattr;

    // ... 其他方法

} PyTypeObject;

```


## 4. 常见内置类型的布局


### 整数 (PyLongObject)

```c

struct _longobject {

    PyObject_VAR_HEAD

    digit ob_digit[1]; // 实际存储的数字数组

};

```


### 列表 (PyListObject)

```c

typedef struct {

    PyObject_VAR_HEAD

    PyObject **ob_item; // 指向元素列表的指针

    Py_ssize_t allocated; // 分配的空间大小

} PyListObject;

```


### 字典 (PyDictObject)

```c

typedef struct _dictkeysobject PyDictKeysObject;


typedef struct {

    PyObject_HEAD

    Py_ssize_t ma_used; // 已用条目数

    PyDictKeysObject *ma_keys; // 键集合

    PyObject **ma_values; // 值数组(仅用于split table)

} PyDictObject;

```


## 5. 对象模型的关键特性


1. **引用计数**:每个对象都维护一个引用计数,用于内存管理

2. **类型指针**:每个对象都知道自己的类型

3. **动态类型**:类型信息在运行时确定

4. **统一接口**:通过类型对象中的函数指针实现多态


## 6. 对象的内存布局示例


```

+-------------------+

| 引用计数 (ob_refcnt) |

+-------------------+

| 类型指针 (ob_type)  | --> PyTypeObject

https://zq.zhaopin.com/moment/71133976

https://zq.zhaopin.com/moment/71133807

https://zq.zhaopin.com/moment/71133755

https://zq.zhaopin.com/moment/71133643

https://zq.zhaopin.com/moment/71133600

https://zq.zhaopin.com/moment/71133548

https://zq.zhaopin.com/moment/71133442

https://zq.zhaopin.com/moment/71133383

https://zq.zhaopin.com/moment/71133290

https://zq.zhaopin.com/moment/71133128

https://zq.zhaopin.com/moment/71132952

https://zq.zhaopin.com/moment/71132866

https://zq.zhaopin.com/moment/71132603

https://zq.zhaopin.com/moment/71132533

https://zq.zhaopin.com/moment/71132525

https://zq.zhaopin.com/moment/71132502

https://zq.zhaopin.com/moment/71132490



+-------------------+

| 对象特定数据        |

| ...               |

+-------------------+

```


对于可变大小对象:

```

+-------------------+

| 引用计数 (ob_refcnt) |

+-------------------+

| 类型指针 (ob_type)  |

+-------------------+

| 元素数量 (ob_size)  |

+-------------------+

| 对象特定数据        |

| ...               |

+-------------------+

```


Python的对象模型设计使得语言具有极大的灵活性,同时保持了相对高效的实现。这种统一的模型是Python动态特性的基础。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101106/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448