基本原理
在Python中,每个类默认都会继承自object
类,而object
类在Python中是一个动态类,允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活,但同时也带来了一些性能和内存使用上的开销。
为了解决这个问题,Python提供了一个特殊的属性__slots__
,它可以用来限制一个类能够拥有的属性数量。当你定义了一个类并指定了__slots__
,这个类将不会使用动态属性字典,而是为每个实例分配固定数量的属性空间。这样做的好处是减少了内存的使用,并且可以提高对象的创建速度。
代码示例
示例1:使用__slots__提升性能
class Employee:__slots__ = ['name', 'age', 'department']def __init__(self, name, age, department):self.name = nameself.age = ageself.department = department# 创建Employee类的实例
emp1 = Employee('Alice', 30, 'HR')
emp2 = Employee('Bob', 25, 'IT')# 打印对象的内存占用
import sys
print(sys.getsizeof(emp1)) # 输出会比不使用__slots__时小
示例2:__slots__与继承
class BaseEmployee:__slots__ = ['name', 'age']def __init__(self, name, age):self.name = nameself.age = ageclass FullTimeEmployee(BaseEmployee):__slots__ = ['department']def __init__(self, name, age, department):super().__init__(name, age)self.department = department# 创建FullTimeEmployee类的实例
fte = FullTimeEmployee('Charlie', 28, 'Marketing')
print(fte.name, fte.age, fte.department)
示例3:__slots__与方法
class Student:__slots__ = ['name', 'scores']def __init__(self, name, scores):self.name = nameself.scores = scoresdef average_score(self):return sum(self.scores) / len(self.scores)# 创建Student类的实例
stu = Student('David', [88, 92, 79, 93])
print(stu.name, stu.average_score())
注意事项
__slots__
定义的属性列表中不应该包含任何方法名。- 如果一个类定义了
__slots__
,那么它就不能继承自一个没有定义__slots__
的类。 __slots__
不支持动态属性的添加,如果需要添加属性,必须在__slots__
中显式声明。- 使用
__slots__
时,不能使用**kwargs
来传递关键字参数,因为这样会创建动态属性。
结论
__slots__
是一个非常有用的特性,特别是在创建大量对象时,它可以帮助我们节省内存并提高性能。然而,它也有一些限制,比如不支持动态属性的添加,以及在继承和方法定义上的限制。因此,在使用__slots__
时,我们需要权衡其带来的性能优势和灵活性的损失。在决定是否使用__slots__
时,应该根据实际的应用场景和性能需求来做出选择。
>
> 【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4 (1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。
>
> (2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。
>
> (3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。
>
> 下载地址:https://www.alipan.com/s/x6fqXe1jVg1
>