Python __slots__与继承的内存优化实战
在类继承体系中如何正确使用__slots__优化内存?如果父类有__slots__而子类没有,子类实例的内存结构是怎样的?如果父子类都有__slots__,如何确保所有属性都被有效管理?多继承中__slots__的限制是什么?给出一个嵌套__slots__类的实际示例。
回答
小字辈
父子类都有__slots__:子类__slots__需包含父类的__slots__吗?不需要。每个类的__slots__只管理该类定义的属性,继承的slot属性由父类管理。
class Point2D:
__slots__ = ('x', 'y')
def __init__(self, x, y):
self.x, self.y = x, y
class Point3D(Point2D):
__slots__ = ('z',)
def __init__(self, x, y, z):
super().__init__(x, y)
self.z = z
p = Point3D(1, 2, 3)
print(p.__slots__) # ('z',)
# p.__dict__ 不存在,所有属性都在slot中
父类有__slots__,子类没有:子类实例既有父类的slot管理属性,又有自己的__dict__(可动态添加属性)。内存介于全slot和全dict之间。
多继承限制:如果一个类继承多个有__slots__的父类,父类中同名的slot会导致TypeError。解决方法:使用公共基类或让其中一个父类无__slots__。
性能基准(100万实例):
- 普通类:~120MB
- __slots__类:~45MB(减少~62%内存)
- 属性访问速度提升约15-20%
注意:__slots__中可包含__dict__以保留动态属性能力:__slots__ = ('x', '__dict__')