I am trying to call a a superclass method from a dataclass with slots=True in Python 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()
I get the following error.
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
It works fine if I remove slots=True from Sub, or make it a non-dataclass with __slots__ manually. The error remains if I instead do these to Base.
Sub.__mro__ is (<class '__main__.Sub'>, <class '__main__.Base'>, <class 'object'>) and isinstance(Sub(), Base) is True.
As seen here, the dataclass decorator creates a new class object, and so the __closure__ attached to hi() is different to the one attached to the decorated class, and therefore the super() call cannot work without arguments due to relying on the __closure__.
Therefore, you need to change super().hi() to super(Sub, self).hi().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With