基本原理
在Python中,__slots__是一个特殊的类属性,它可以用来限制一个类可以拥有的属性数量。这个特性在Python中非常有用,尤其是在创建大量实例时,可以显著减少内存的使用。
通常,Python的类会为每个实例自动创建一个字典来存储其属性。但是,当创建大量的实例时,这些字典会占用大量的内存。通过定义__slots__,我们可以指定一个类只能拥有特定的属性,这样Python就会使用一个固定大小的数组来存储这些属性,而不是字典。
代码示例
示例1:定义一个简单的类
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
在这个示例中,Student类有两个属性:name和age。每次创建Student的实例时,Python都会为这个实例创建一个字典来存储这些属性。
示例2:使用__slots__减少内存使用
class Student:
__slots__ = ['name', 'age'] # 指定只能有name和age两个属性
def __init__(self, name, age):
self.name = name
self.age = age
在这个修改后的示例中,我们通过__slots__指定了Student类只能拥有name和age两个属性。这样,Python就不会为每个实例创建一个字典,而是使用一个固定大小的数组来存储这些属性。
示例3:__slots__与继承
class Person:
__slots__ = ['name']
def __init__(self, name):
self.name = name
class Student(Person):
__slots__ = ['age']
def __init__(self, name, age):
super().__init__(name)
self.age = age
在这个示例中,Person类和Student类都定义了__slots__。Student继承了Person,并且添加了自己的属性age。需要注意的是,当子类定义了__slots__时,它不会继承父类的__slots__。
注意事项
__slots__可以是字符串的列表,也可以是字符串的元组。__slots__可以包含方法名,但通常不建议这样做。- 如果类中有
__init__方法,那么在__slots__中必须包含__init__方法中初始化的所有属性。 __slots__不支持动态属性的添加,即使用setattr()动态添加的属性将不会被包含在__slots__中。- 使用
__slots__可以提高性能,但过度使用可能会使代码变得难以理解和维护。
结论
__slots__是Python中一个非常有用的机制,它可以帮助我们优化内存使用,特别是在创建大量对象时。然而,它也有一些限制和注意事项,开发者在使用时需要谨慎考虑。总的来说,__slots__是一个强大的工具,可以在适当的场景下提高程序的性能和效率。

>
> 【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4 (1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。
>
> (2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。
>
> (3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。
>
> 下载地址:https://www.alipan.com/s/x6fqXe1jVg1
>






![[JDK工具-10] jvisualvm 多合一故障处理工具](https://img-blog.csdnimg.cn/direct/2f155f81a9f847b1aca6787df6a98a0f.png)











