CodeWalk

Python __slots__与继承的内存优化实战

作者:小字辈 · 2026-05-30 12:55

在类继承体系中如何正确使用__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__')