官方文档中介绍,__slots__允许我们显式声明数据成员(如属性),并拒绝创建__dict__和__weakref__(除非在__slots__中明确声明或在父类中可用)。使用__slots__相对于使用__dict__,能节省大量内存,且属性查找速度更快。在使用__slots__时,需要明确指出声明的变量,Python将为这些变量预留空间...
python的__slots__属性
我们先探讨一个问题:对象通过类实例化后,如何存储自己的属性?默认情况下,Python中对象的属性是通过字典形式储存的。通过查看特殊的object.__dict__,可以了解对象有哪些属性。
object.__dict__在Python官方文档中的解释为:用于存储对象的(可写)属性的字典或其它映射对象。
在交互式模式中测试定义类的__slots__属性前后,对象属性的变化情况,可以对比是否定义__slots__属性对类属性的影响。通过打印结果,可以看出在是否使用__slots__属性时,对象属性的储存方式有何不同。
在定义类时使用__slots__属性后,对象存储属性的方式发生改变。此时,属性查找速度能显著提高,同时节省内存空间。
官方文档中介绍,__slots__允许我们显式声明数据成员(如属性),并拒绝创建__dict__和__weakref__(除非在__slots__中明确声明或在父类中可用)。使用__slots__相对于使用__dict__,能节省大量内存,且属性查找速度更快。
在使用__slots__时,需要明确指出声明的变量,Python将为这些变量预留空间,防止为每个实例自动创建__dict__和__weakref__。这有助于在处理大量属性不多的实例时节省内存。
切记,__slots__不宜过早使用。只有当实例化对象达到数百万个时,才有必要考虑使用__slots__进行优化。
官方文档中提到,通过__slots__限制创建非法属性,可以避免错误。通过示例代码演示了在__slots__中定义属性与未定义属性时,对象行为的对比。
为了验证节省内存的效果,使用了《Fluent Python》示例代码进行测试。在MacBookPro上测试时,使用__slots__优化后,内存消耗明显减少。在阿里云上测试时,未使用__slots__优化的程序直接崩溃,说明内存管理问题严重。
关于__slots__的源码实现,可参考B站视频教程,详细解释了这种特殊效果的实现机制。在创建类对象时,函数`type_new`完成__slots__的实现。该实现位于Cpython源码的`Objects/typeobject.c`文件中。2024-11-18