__slots__ 的作用和原理
Python 中 __slots__ 的作用是什么?它如何节省内存?使用它有什么限制?
回答
编译有声
__slots__ 声明实例属性白名单,禁止创建 __dict__,从而节省内存并提高属性访问速度。
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'
好处:
- 每个实例节省约 50-60%(去掉
__dict__) - 属性访问速度更快(直接偏移量访问)
限制:
- 不能动态添加未声明的属性
- 不能用于需要
__dict__的功能(如vars(obj)) - 继承时子类也需要定义
__slots__才能生效