跳到内容

single-string-slots (PLC0205)

源自 Pylint 代码检查工具。

作用

检查分配给 __slots__ 的单个字符串。

为什么这不好?

在 Python 中,__slots__ 属性允许您显式定义类可以拥有的属性(实例变量)。默认情况下,Python 使用字典来存储对象的属性,这会产生一些内存开销。但是,当定义了 __slots__ 时,Python 使用更紧凑的内部结构来存储对象的属性,从而节省内存。

任何字符串可迭代对象都可以分配给 __slots__(最常见的是字符串的 tuple)。如果将字符串分配给 __slots__,它将被解释为单个属性名称,而不是属性名称的可迭代对象。这可能会引起混淆,因为迭代 __slots__ 值的用户可能希望迭代属性序列,但实际上会迭代字符串的字符。

要在 __slots__ 中使用单个字符串属性,请将字符串包装在可迭代的容器类型中,例如 tuple

示例

class Person:
    __slots__: str = "name"

    def __init__(self, name: str) -> None:
        self.name = name

建议改为

class Person:
    __slots__: tuple[str, ...] = ("name",)

    def __init__(self, name: str) -> None:
        self.name = name

参考