结论:需要"自带样板代码的可变数据类"选 @dataclass(自动生成 __init__/__repr__/__eq__,支持默认值、类型注解、字段校验钩子);需要"轻量不可变、可解包、可当 tuple 用"的记录选 namedtuple。经验法则:领域对象用 dataclass,纯值传输、需要与 tuple 互操作时用 namedtuple。

展开:差异逐项:1)可变性——namedtuple 继承 tuple 天然不可变;dataclass 默认可变,frozen=True 变不可变并顺带获得 hash。2)内存与速度——namedtuple 是 tuple,内存紧凑、访问快;dataclass 是普通类(实例带 __dict__),更重但可加方法、可用 __slots__=True(3.10+)追回内存。3)功能——dataclass 有 field(default_factory=...) 处理可变默认值、__post_init__ 做派生计算与校验、asdict/astuple 转换、比较排序(order=True);namedtuple 胜在有 _replace_asdict 和索引访问。4)类型检查——两者注解都能被 mypy 识别,dataclass 的字段语义更完整。易错点:dataclass 的可变默认值必须走 default_factoryfield(default_factory=list)),直接写 items: list = [] 会报错——这正是可变默认参数陷阱的类版本;比较字段顺序影响排序结果。

from dataclasses import dataclass, field

@dataclass(frozen=True, order=True)
class Point:
    x: float
    y: float
    tags: list = field(default_factory=list, compare=False)

追问方向:pydantic 模型与 dataclass 的分工(运行时校验 vs 轻量结构)、attrs 库的差异化能力。