При запуске файла напрямую будет выведено a equals b. Метод A.eq всегда возвращает True, независимо от типа и значения второго объекта.
Переопределение __eq__: почему a equals b
При запуске файла напрямую будет выведено 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__ не печатается.