__eq__, нужно внутри класса создать функцию def __eq__(self, other):. self) с атрибутами другого объекта (other) и вернуть True, если объекты равны, и False в противном случае.
class MyClass:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
Для определения метода __eq__, который позволяет сравнивать объекты с помощью оператора ==, необходимо реализовать его в классе. Метод __eq__ должен принимать два аргумента: self (ссылка на текущий объект) и other (объект, с которым происходит сравнение).
Внутри метода __eq__ следует определить логику сравнения. Обычно сравниваются атрибуты объектов. Важно учитывать, что если объекты не сравнимы (например, принадлежат к разным классам), следует возвращать NotImplemented. Если объекты равны, возвращается True, в противном случае - False.
Вот пример реализации:
class MyClass:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return NotImplemented
# Пример использования
obj1 = MyClass(10)
obj2 = MyClass(10)
obj3 = MyClass(20)
print(obj1 == obj2) # Вывод: True
print(obj1 == obj3) # Вывод: False
print(obj1 == "test") # Вывод: NotImplemented (и может привести к вызову __ne__ у "test", если он определен)
Важные моменты:
NotImplemented позволяет Python попробовать сравнить объекты, используя метод __eq__ другого объекта (other).__eq__, рекомендуется также реализовать __ne__ (not equal), __lt__ (less than), __le__ (less or equal), __gt__ (greater than), и __ge__ (greater or equal) для обеспечения согласованности сравнений. Можно воспользоваться декоратором @functools.total_ordering из модуля functools, если определены __eq__ и один из методов __lt__, __le__, __gt__, или __ge__.__hash__. __hash__ должен возвращать целочисленное значение, которое должно быть одинаковым для объектов, которые равны друг другу (obj1 == obj2). Если метод __eq__ переопределен, но метод __hash__ не реализован, объект станет не хешируемым.В заключение, __eq__ является важным методом для определения логики сравнения объектов, и его правильная реализация важна для корректной работы кода.