__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__
является важным методом для определения логики сравнения объектов, и его правильная реализация важна для корректной работы кода.