__slots__的核心作用是限制实例属性以减少内存占用、提升访问速度并强制接口约束;它通过禁用__dict__、预分配固定内存偏移实现约56字节/实例的紧凑存储和15%~30%的属性访问加速,同时防止未声明属性赋值。

__slots__ 的核心作用是限制实例属性,从而减少内存占用、提升访问速度。它通过禁止动态添加属性和替换默认的 __dict__ 字典,让 Python 对象以更紧凑的方式存储数据。
节省内存:避免每个实例都携带 __dict__
默认情况下,Python 实例会自带一个 __dict__ 字典来存储所有动态属性。这个字典本身就要占用约 240 字节(64 位系统),再加上键值对的额外开销。当创建成千上万个对象时,内存增长非常显著。
启用 __slots__ 后,Python 不再为实例分配 __dict__,而是将属性直接存放在预分配的固定偏移位置(类似 C 结构体),每个属性只占对应类型的原始空间(如 int 占 28 字节,字符串引用占 8 字节)。
示例对比:
立即学习“Python免费学习笔记(深入)”;
- 普通类实例:约 240+ 字节基础开销 + 属性值存储
- 定义
__slots__ = ('x', 'y', 'name')的类:仅需约 3×8 字节(引用)+ 少量结构体头信息 ≈ 56 字节左右
加速属性访问:跳过字典查找
没有 __slots__ 时,每次访问 obj.x 都要经过 __dict__ 的哈希查找;启用后,Python 直接按偏移量读取内存,相当于“硬编码地址”,速度提升约 15%~30%(实测常见场景)。
这种优化在高频调用的数值计算、游戏实体、网络包解析等场景中效果明显。
强制接口约束:防止意外赋值
__slots__ 会禁止给实例添加未声明的属性(如 obj.z = 1 会抛 AttributeError)。这有助于早期发现拼写错误、规范数据结构,尤其适合构建 DTO、配置项或协议模型。
注意:__slots__ 只作用于实例,不影响类属性;若需允许动态属性,可显式加入 '__dict__' 到 slots 元组中(但会失去内存优势)。
使用注意事项
启用 __slots__ 时需留意几个关键点:
- 子类不会自动继承父类的
__slots__,必须显式定义(否则子类仍有__dict__) - 不能和
__getstate__/__setstate__或某些序列化库(如 pickle)完全兼容,需额外适配 - 不支持弱引用(
weakref)——除非把'__weakref__'显式加入 slots - 仅适用于新式类(Python 3 中所有类默认都是),且不能与具有
__dict__的类混用多重继承
不是所有场景都需要 __slots__,但在明确属性集、强调性能或资源受限(如嵌入式、高频服务)时,它是轻量而有效的优化手段。










