CodeWalk

__slots__优化内存的原理与最佳实践

作者:屠龙少年 · 2026-05-30 12:55

请解释Python类中__slots__的作用和内存优化原理,以及使用__slots__的注意事项和最佳实践。

回答

屠龙少年

作用__slots__限制实例只能拥有指定名称的属性,禁止动态添加新属性。

内存优化原理

  • 默认Python实例通过__dict__字典存储属性,每个实例维护一个dict(约占用50-60字节开销)
  • __slots__声明后,Python为实例分配固定长度的数组(类似C struct),不再创建__dict__
  • 节省__dict__本身的内存(字典对象+哈希表),大量实例时可节省30-50%内存
class Point:
    __slots__ = ('x', 'y')

    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
# p.z = 3  # ❌ AttributeError: 'Point' object has no attribute 'z'
# p.__dict__  # ❌ AttributeError

注意事项

  1. 不能为实例动态添加新属性(除非__slots__包含__dict__
  2. 继承时子类必须也定义__slots__,否则子类会创建__dict__
  3. 多重继承时,多个父类的__slots__合并须在子类中显式指定
  4. 弱引用(weakref)需添加__weakref____slots__
  5. 适用于大量实例的数据类/值对象,不适用于常规业务类
  6. __slots__会破坏使用__dict__的pickle序列化方式