page contents

解释一下Python __slots__ 的作用和适用场景

在 Python 里有个挺特别的东西,叫 __slots__,我第一次接触它还是在公司楼下咖啡厅,跟小李聊优化内存占用的时候。他突然冒出一句:“你知道 __slots__ 吗?能省好多内存。”我当时愣了半天,以为他说的是什么数据库的 slot,后来才明白原来是类里用的。

attachments-2025-09-ZyRvykBa68d5e9cb52c1c.png在 Python 里有个挺特别的东西,叫 __slots__,我第一次接触它还是在公司楼下咖啡厅,跟小李聊优化内存占用的时候。他突然冒出一句:“你知道 __slots__ 吗?能省好多内存。”我当时愣了半天,以为他说的是什么数据库的 slot,后来才明白原来是类里用的。

为什么会有 __slots__

平常我们定义一个类,实例化的时候,Python 会默认给每个实例分配一个 __dict__,用来存储属性。好处是灵活,你想加啥属性都行,坏处也明显,就是内存占用大,而且访问速度稍微慢点。 比如:

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

u = User("Tom"20)
u.__dict__
# {'name': 'Tom', 'age': 20}

你看,每个实例都会有个 __dict__,里面存属性。

如果你要建成千上万个对象,比如日志系统里那种数据类对象,这内存开销就很恐怖了。于是 __slots__ 就出现了,它能告诉 Python:我的对象只需要哪些属性,别给我 __dict__,也别让我随便加新属性。

怎么用 __slots__

class User:
    __slots__ = ("name""age")
    def __init__(self, name, age):
        self.name = name
        self.age = age

u = User("Tom"20)
print(u.name, u.age)

这样一来,User 的实例就只能有 name 和 age 这两个属性,你要是想再加个 u.email = "xx@xx.com",直接报错。

它到底好在哪

  • 省内存:因为没有 __dict__,实例不会为动态属性开额外的哈希表空间,内存用得更紧凑。
  • 速度快:属性访问比通过 __dict__ 稍微快一些。
  • 限制属性:避免手抖加了一堆乱七八糟的属性,保证结构固定。

我之前写一个日志采集的小模块,里面每条日志都是一个对象,本来内存飙升得厉害,后来加了 __slots__,内存用量直接少了一半,效果肉眼可见。

什么时候别用

当然它不是万能的,如果你写的类就是需要动态加属性,或者要和一些依赖 __dict__ 的库(比如序列化框架)配合,那就别用 __slots__。另外它不能和多重继承很好地玩在一起,容易出坑。

举个反例:

class A:
    __slots__ = ("x",)

class B:
    __slots__ = ("y",)

class C(A, B):  # 多继承会出问题
    pass

你跑这个就会报错,说 __slots__ 的布局不兼容。所以多继承场景下要小心。

适用场景总结

  • 大量小对象,内存敏感的环境,比如日志行、监控数据点。
  • 需要固定属性集合的类,比如配置项、点坐标 (x, y) 之类。
  • 对性能有点极致追求的地方,可以当成小优化。

不过要是写业务系统,类不多,随便加个属性无所谓,那就别折腾 __slots__ 了,灵活性比节省那点内存更重要。

你要不要我再写个内存对比的小 demo?比如同样一万个对象,有和没有 __slots__ 的内存占用差距。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-09-26 09:18
  • 阅读 ( 40 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1407 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2224 文章
  3. Pack 1407 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章