__slots__作用
__slots__有一个作用是:限制类实例绑定的属性,但是它有一个更重要的作用就是节省内存,当然更适用于数据量大的情况(万量级以上)。
__slots__节省内存的原理
class Measurement:
def __init__(self, x, y, value):
self.x = x
self.y = y
self.val = value
m1 = Measurement(1, 2, "Happy")
m2 = Measurement(7, 10, "Crazy")
m2.other = True
其实,对类的变量值进行初始化,底层是通过一个指针指向__dict__(里面包含潜在的字段名和字段值)。举个例子,上面的程序底层实现过程如下:

通过__slots__,我们可以稍微调整一下类,以改变类中字段的存储方式,废弃原来那种耗费内存的1对1重复的字典分配方式。具体如下:
class Measurement:
__slots__ = ['x', 'y', 'val']
def __init__(self, x, y, value):
self.x = x
self.y = y
self.val = value
这样我们底层的实现就会变为如下方式:

以上就是__slots__能够节省内存的原理,主要还是要搞清楚python的类变量初始化的底层操作是通过字典存储后相关联这一方式进行的,__slots__只是改变了字典key,value与实例相关联的方式,可以总结如下:
-
默认变量实例化方法:底层实例和字典是一对一的关系
-
加入__slots__后:底层实例和字典是多对一的关系(重复的部分)。