3 подписчика

@dataclass сравнение объектов класса (__eq__)


Если мы хотим сравнить два объекта одного класса на равенство, то @dataclass уже поддерживает встроенное сравнение, когда сравниваются все атрибуты объектов.

При использовании стандартных классов (без декоратора @dataclass) операция сравнения объектов была бы недоступна. Ее потребовалось бы специально прописывать через метод __eq__.

Дополнительно в @dataclass можно прописать собственное условия, как сравнивать между собой объекты. Например, можно сравнивать объекты не по всем атрибутам, а только по какому-то одному атрибуту. В этом случае надо прописать данное условие в методе __eq__.

В примере №1 сравниваются два объекта класса, созданного через @dataclass, через логику сравнения по умолчанию (сравниваются между собой все атрибуты объектов и если какие-нибудь атрибуты отличались, то мы получили бы False).

В примере №2 мы прописали метод __eq__ и отразили в нем логику, что объекты сравниваются между собой только на базе атрибута name. Соответственно не учитываются различия по другим атрибутам. И, получается, что несмотря на то, что объекты имеют разные атрибуты region и level, они равны между собой (True).