跳到内容

namedtuple 子类的 no-slots (SLOT002)

派生自 flake8-slots 代码检查器。

作用

检查缺少 __slots__ 定义的 collections.namedtupletyping.NamedTuple 子类。

为什么这不好?

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

namedtuple 的子类继承了内置 namedtuple 类的所有属性和方法。由于元组通常是不可变的,因此它们不需要 namedtuple 类提供的属性之外的额外属性。为 namedtuple 的子类定义 __slots__ 可以防止为每个实例创建字典,从而减少内存消耗。

示例

from collections import namedtuple


class Foo(namedtuple("foo", ["str", "int"])):
    pass

建议改为

from collections import namedtuple


class Foo(namedtuple("foo", ["str", "int"])):
    __slots__ = ()

参考