如何创建含__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
相关产品推荐
相关产品推荐

