python中的__slots__ 是如何工作的,何时使用?

在 Python 中,__slots__ 是一个特殊的类变量,用于限制类的属性并优化内存使用。当你定义 __slots__ 时,你可以显式指定类可以拥有的属性,从而避免使用动态字典来存储实例属性。这可以减少内存占用并加快属性访问速度。
工作原理

    定义 __slots__: 在类中定义 __slots__ 为一个元组或列表,包含你希望允许的属性名称。

    内存优化: 通过定义 __slots__,Python 不会为每个实例创建一个 __dict__(用于存储实例属性的字典)。而是使用固定的内存结构来存储这些属性。

示例

python

class Point:
    __slots__ = ['x', 'y']  # 限定只有 x 和 y 两个属性

    def __init__(self, x, y):
        self.x = x
        self.y = y

# 使用
p = Point(1, 2)
print(p.x, p.y)  # 输出: 1 2

# p.z = 3  # 会抛出 AttributeError,因为 z 不在 __slots__ 中

何时使用 __slots__

    内存优化:当你创建大量实例并且希望减少内存占用时,使用 __slots__ 是有益的。
    性能提升:在某些情况下,访问 __slots__ 定义的属性比访问普通实例字典中的属性更快。
    限制属性:当你希望类的属性数量受限,或者想要防止添加不必要的属性时,使用 __slots__ 可以帮助实现这一目标。

注意事项

    使用 __slots__ 后,类实例不能再动态添加属性(除非这些属性在 __slots__ 中定义)。
    不能与多重继承中的某些特性一起使用,特别是当基类也使用 __slots__ 时,可能会引发问题。
    不支持一些特殊的属性和方法(如 __dict__ 和 __weakref__)。

总的来说,__slots__ 是一个强大的工具,用于优化内存和性能,但在使用时需要注意其限制和影响。

请使用浏览器的分享功能分享到微信等