← Все вопросы
Как сделать, чтобы два объекта сравнивались по значению через == ?
17
У меня класс точки:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
a = Point(1, 2)
b = Point(1, 2)
print(a == b) # False
Почему a == b даёт False, хотя координаты одинаковые? Как сделать, чтобы сравнивались именно поля?
2 ответа
31
По умолчанию объекты сравниваются по id (то есть это один и тот же объект в памяти или нет), а не по содержимому. Чтобы сравнивать по полям, переопредели __eq__:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
if not isinstance(other, Point):
return NotImplemented
return (self.x, self.y) == (other.x, other.y)
Теперь Point(1, 2) == Point(1, 2) даёт True. Важная грабля: как только определяешь __eq__, объект становится нехешируемым (его нельзя класть в set или использовать ключом словаря) — для этого нужно ещё __hash__. Если объект неизменяемый, добавь def __hash__(self): return hash((self.x, self.y)).
Max Pogodin А ещё проще через dataclass, там __eq__ генерится сам · 1 месяц назад
Максим Герасимов Про NotImplemented — важный момент, многие пишут return False и ломают сравнение с другими типами · 1 месяц назад
8
Переопредели __eq__.
Ваш ответ
Войдите, чтобы ответить на вопрос.