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

如何创建含__dict__的Python slots数据类?报错问题解析

dataclass slots=True时声明__dict__报错的原因与解决方法

问题原因

当使用@dataclass(slots=True)装饰类时,如果你像普通实例字段那样显式声明__dict__: dict[str, object],dataclass装饰器会将其当作一个普通的实例属性来处理,而非slots机制的一部分。

在初始化实例时,dataclass会尝试为这个“普通字段”赋值,但实际上在slots模式下,__dict__是被Python解释器特殊管理的,其实际类型是mappingproxy,无法被直接赋值为字典,因此触发TypeError: __dict__ must be set to a dictionary, not a 'mappingproxy'。

而普通slots类之所以能正常拥有__dict__,是因为它们是在__slots__元组中声明该属性,而非将其作为普通实例字段定义。

解决方法

要让带slots的dataclass拥有__dict__,需要通过slots机制来声明它,而非当作普通实例字段。有两种可行写法:

写法1:直接在datac装饰器的slots参数中指定

from dataclasses import dataclass

@dataclass(slots=['__dict__'])
class A:
    pass

写法2:在类内定义__slots__属性

from dataclasses import dataclass

@dataclass(slots=True)
class A:
    __slots__ = ('__dict__',)

以上两种写法都能让类A的实例拥有__dict__,支持动态添加属性,且实例化时不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:20:01