标准答案

  1. dataclass 可明确字段、默认值和 frozen 语义,但可变字段仍需防御性复制。
  2. namedtuple 轻量且可按位置访问,字段扩展和复杂校验能力有限。
  3. 普通类适合构造时校验、资源生命周期和复杂方法,但需要更多样板代码。
  4. 对象选择要考虑序列化、兼容、内存、可变性和团队可读性。

题目解析

dataclass 适合表达字段和构造/比较语义,frozen 只限制属性重新赋值,不会递归冻结 list、dict 等成员。namedtuple 适合轻量不可变序列,但位置访问和扩展会形成耦合。

普通类适合复杂不变式、资源生命周期和行为封装,构造时应完成必要校验。数据对象、数据库实体和外部 API DTO 的生命周期不同,不能默认共用。

序列化和兼容要显式定义字段、默认值、未知字段和版本。可变成员需要防御性复制或不可变视图。

常见误区

  • 误区:frozen dataclass 深度不可变。改正:对 list/dict 等成员做复制、只读包装或使用不可变类型。
  • 误区:按位置使用 namedtuple。改正:优先按字段名访问,字段顺序变更要有兼容策略。
  • 误区:把 ORM 模型直接作为外部响应。改正:使用独立 DTO,控制字段、权限和序列化格式。

作者信息