Dataclass not inheriting __eq__() method from its parent

Question:

I have a parent dataclass and a sub-dataclass inherits the first class. I’ve redefined __eq__() method in parent dataclass. But when I compare objects sub-dataclass, it doesn’t use the __eq__() method defined in parent dataclass. Why is this happening? How can I fix this?

MWE:

from dataclasses import dataclass


@dataclass
class A:
    name: str
    field1: str = None

    def __eq__(self, other):
        print('A class eq')
        return self.name == other.name


@dataclass
class B(A):
    field2: str = None


b1 = B('b', 'b1')
b2 = B('b', 'b2')
print(b1 == b2)
Asked By: Nagabhushan S N

||

Answers:

The @dataclass decorator adds a default __eq__ implementation.

If you use

@dataclass(eq=False)

on class B, it will avoid doing that.

See https://docs.python.org/3/library/dataclasses.html

Answered By: khelwood

By default, the dataclass decorator generates an __eq__ method for the decorated class. To disable this (allowing B to inherit A.__eq__), you need to adjust the decorator.

@dataclass(eq=False)
class B(A):
    field2: str = None
Answered By: chepner