← Все вопросы

Как сделать, чтобы два объекта сравнивались по значению через == ?

Задан 2 месяца назад625 просмотров2 ответа
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__.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект