为何设置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
相关产品推荐
相关产品推荐

