当实例特别多的时候,达到百万级别时,使用slot可节省内存
- 定义一个普通的类
class People():
def __init__(self, name, sex, height, weight):
self.name = name
self.sex = sex
self.height = height
self.weight = weight
- 使用slot的类
class PeopleSlot():
__slots__ = ["name", "sex", "height", "weight"]
def __init__(self, name, sex, height, weight):
self.name = name
self.sex = sex
self.height = height
self.weight = weight
- 创建两个类的实例:
one = People(“Tim”, “male”, “180”, “78”)
two = PeopleSlot(“Alice”, “female”, “158”, “45”)
查看两个实例的属性:
-
做差集,发现使用slot后的缺少了__dict__和__weakref__属性
- __weakref__只是一个不透明的对象,在不使用弱引用时,不占什么内存
- 对于每个实例,如果没有变量,则定义的类__slots__不支持对其实例的弱引用。如果需要弱引用支持,则__weakref__在__slots__声明中添加到字符串序列。
- __weakref__只是一个不透明的对象,在不使用弱引用时,不占什么内存
使用,主要占内存的是__dict__
- __dict__实现了实例的动态绑定,占用的一定的内存
- 实例越多,one.__dict__占用的内存越大。
- 下图操作步骤:
- 查看one.__dict__中的内容
- 查看one.__dict__占用的内存
- one添加属性
- 再次查看one.__dict__占用内存
- 给使用了slot的实例,就不能添加属性
总结,实例很多时,可以使用__slots__ = []来定义