Переопределение __eq__: почему a equals b

При запуске файла напрямую будет выведено a equals b. Метод A.__eq__ всегда возвращает True, независимо от типа и значения второго объекта.

Короткий ответ

Что ответить на собеседовании

При запуске файла напрямую будет выведено a equals b. Метод A.eq всегда возвращает True, независимо от типа и значения второго объекта.

Подробный разбор

Ответ с пояснениями

Условие

class A:
    def __eq__(self, other):
        return True

class B:
    pass

if __name__ == "__main__":
    a = A()
    b = B()
    if a == b:
        print("a equals b")
    else:
        print("a does not equal b")

Ответ

При запуске файла напрямую будет выведено a equals b. Метод A.eq всегда возвращает True, независимо от типа и значения второго объекта.

Выражение a == b в этом случае вызывает реализацию сравнения A, которая не выполняет никаких проверок. То, что объекты относятся к разным классам, не мешает пользовательскому методу объявить их равными.

Такое сравнение обычно некорректно для реального домена. Для неподдерживаемого типа лучше возвращать NotImplemented, а для поддерживаемого — сравнивать значимые поля. Переопределение __eq__ также влияет на хешируемость экземпляров. При импорте модуля блок под проверкой __main__ не печатается.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее