You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何设置slots=True会使dataclass忽略字段默认值?

问题:dataclass设置slots=True后未初始化字段报错的原因

以下代码运行符合预期:

from dataclasses import dataclass

@dataclass(slots=False, init=False)
class Test:
    field: str = "default value"


print(Test())  # 输出 "Test(field='default value')"

但将slots改为True时,会抛出如下错误:

AttributeError: 'Test' object has no attribute 'field'

已知解决方法为使用生成的__init__方法,或在自定义__init__方法中显式初始化所有字段,请问该行为背后的原因是什么?


原因分析

  • 当slots=False时,类默认使用**实例字典(__dict__)**存储属性。即使未定义__init__方法,Python会自动将类级别的默认属性值复制到实例的__dict__中,因此实例可以正常访问field。
  • 当slots=True时,类会禁用实例字典,转而使用预定义的**槽位(slots)**来存储属性。槽位机制的核心要求是:实例的所有属性必须被显式初始化——要么依赖dataclass自动生成的__init__方法完成初始化,要么在自定义的__init__方法中手动为每个字段赋值。
  • 你设置了init=False,既禁用了dataclass自动生成的初始化逻辑,又未自行编写初始化代码,导致实例的槽位中从未创建field属性,因此访问时会抛出AttributeError。

内容的提问来源于stack exchange,提问作者enkryptor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:14:54