Python 3.10.5中带slots=True的dataclass子类调用super()报TypeError
Python 3.10.5中带
slots=True的dataclass子类调用父类方法报错问题 问题代码
from dataclasses import dataclass @dataclass(slots=True) class Base: def hi(self): print("Hi") @dataclass(slots=True) class Sub(Base): def hi(self): super().hi() Sub().hi()
报错信息
Traceback (most recent call last): File "...", line 16, in <module> Sub().hi() File "...", line 13, in hi super().hi() TypeError: super(type, obj): obj must be an instance or subtype of type
已知现象
- 移除
Sub类的slots=True,或把Sub改为手动定义__slots__的普通类,代码可正常运行 - 修改
Base类的slots设置,错误仍存在 - 验证过
Sub.__mro__为<class '__main__.Sub'>, <class '__main__.Base'>, <class 'object'>,且isinstance(Sub(), Base)返回True
原因分析
这是Python 3.10.x中dataclass配合slots=True实现的一个bug:当子类使用@dataclass(slots=True)继承同样带slots=True的dataclass父类时,生成的子类实例内部类型结构出现异常,干扰了super()的类型检查逻辑,导致合法实例被误判为不符合要求的类型。
解决方案
有几种可行的解决方式:
- 移除子类的
slots=True:如果子类不需要slots内存优化,直接去掉该参数即可正常使用super()调用父类方法 - 手动定义子类的
__slots__:保留dataclass装饰器,但手动声明__slots__替代slots=True参数:
from dataclasses import dataclass @dataclass(slots=True) class Base: def hi(self): print("Hi") @dataclass class Sub(Base): __slots__ = () def hi(self): super().hi() Sub().hi()
- 升级Python版本:该bug在Python 3.11及以上版本中已被修复,升级到更高版本即可彻底解决问题
内容的提问来源于stack exchange,提问作者LeopardShark
相关产品推荐
相关产品推荐

