在 dataclass(slots=True) 子类中调用 super() 时出现类型错误

Leo*_*ark 12 python inheritance slots python-dataclasses

我正在尝试使用slots=TruePython 3.10.5 中的数据类调用超类方法。

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()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误。

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
Run Code Online (Sandbox Code Playgroud)

slots=True如果我从 中删除Sub,或者手动将其设为非数据类,则效果很好__slots__。如果我改为执行这些操作,错误仍然存​​在Base

Sub.__mro__(<class '__main__.Sub'>, <class '__main__.Base'>, <class 'object'>)isinstance(Sub(), Base)True

hen*_*ves 12

这里可以看出,数据类装饰器创建了一个新的类对象,因此__closure__附加到hi()的对象与附加到装饰类的对象不同,因此super()由于依赖于__closure__.

因此,您需要更改super().hi()super(Sub, self).hi().