__slots__优化内存的原理与最佳实践
请解释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
注意事项:
- 不能为实例动态添加新属性(除非
__slots__包含__dict__) - 继承时子类必须也定义
__slots__,否则子类会创建__dict__ - 多重继承时,多个父类的
__slots__合并须在子类中显式指定 - 弱引用(
weakref)需添加__weakref__到__slots__ - 适用于大量实例的数据类/值对象,不适用于常规业务类
__slots__会破坏使用__dict__的pickle序列化方式