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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:18:03