魔法__slots__的妙用

slots的中文解释

在Python中,slots是一个牛逼的魔法关键词
它更多的是用于面向对象的类和实例中,发挥以下三点重要作用

  1. 快速访问类的属性
  2. 限制类的实例属性
  3. 优化内存

一、快速访问类的属性

一般说来定义用实例一个类如下操作

现在加入 __slots__ 魔法

加不加魔法有什么区别呢?
现在用 timeit 的 repeat 方法执行个 100W 次试试看

  • 先来看不加__slots__魔法的情况 运行后可以看到所需要的时间是:
  • 现在加入__slots__来运行一次 从运行时间比较得出,加不加__slots__魔法对程序执行效率影响较大,加魔法后运行速度更快了,这就是所谓的快速访问类的属性。

二、限制类的实例属性

通常情况下,类的实例化及属性访问是这样的:

现在有个新的概念
动态绑定
是什么意思呢?就是实时增加实例的属性,如下搞法:
临时增加了实例对象的 playgame 属性,并成功访问

如果不允许任意增加对象的属性,就要用__slots__ 魔法进行限制,此例中只允许 name age sex 三个属性,不能追加其它任何属性了

通过魔法对对象属性进行了严格的限制,再运行会报错,成功限制了实例属性:

三、优化内存

这里使用 memory_profiler 来测量内存消耗,实例化 100W 次
不加__slots__魔法内存消耗如下:

加上__slots__魔法的情况如下:
可以看到存在消耗明显减少,这就是__slots__的优势