Rich comparisons Python: ранжирование объектов разных классов
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Сравнение и хеширование Python: задачи на eq, lt и set.
Ранжирование ставок на аукционе
На закрытых торгах участники заявляют предложения двух видов: обычные денежные залоги и золотые векселя с фиксированным номиналом и премиальным статусом клиента. Торговая система ранжирует поступающие заявки строго по сумме. Если же суммы оказываются одинаковыми, обычная ставка уступает премиальному векселю, а заявки одной категории с равными суммами признаются равнозначными.
Программа распределяет ответственность между двумя типами объектов. Класс обычной ставки не знает о внутреннем устройстве премиального векселя и при прямом сравнении с ним возвращает NotImplemented. Этот сигнал позволяет механизму rich comparisons автоматически обратиться к отражённому оператору более сложного класса векселя и корректно определить старшинство.
Реализуйте классы обоих типов ставок так, чтобы любые сравнения между ними разрешались без ошибок типов по правилам торговой системы.
Что уже дано
В редакторе представлены заготовки классов CashBid и GoldBill с заглушками методов __init__, __eq__, __lt__ и __gt__. Вспомогательные функции для наблюдения за проверками доступны в окружении при запуске.
Что нужно сделать
Реализуйте классы CashBid(amount: int) и GoldBill(amount: int).
Каждый класс принимает аргумент amount (целое число от 0 до 1_000_000_000) и сохраняет его в атрибуте экземпляра amount. В серии может проверяться от 0 до 1000 ставок.
Для обоих классов реализуйте методы rich comparisons: __eq__, __lt__ и __gt__. Операторы ==, !=, < и > должны строго следовать правилам:
- Сначала сравниваются суммы заявок: предложение с большей суммой всегда старше независимо от категории.
- Если суммы равны, обычная ставка
CashBidсчитается меньше премиального векселяGoldBill. - Две заявки одной категории с равными суммами считаются равными.
- Методы
CashBidумеют сравнивать экземпляр только с другимCashBid. Если в методы__eq__,__lt__или__gt__классаCashBidпередан объектGoldBillили любой посторонний объект, метод обязан вернуть специальное значениеNotImplemented. - Методы
GoldBillумеют сравнивать экземпляр как с другимGoldBill, так и со ставкойCashBid. Результатом успешного сравнения должно быть булево значение (TrueилиFalse). Если передан посторонний объект, методыGoldBillвозвращаютNotImplemented. - Реализовывать методы
__hash__,__repr__,__str__,__le__или__ge__, а также проверку валидности входных аргументов конструктора не требуется.
Ввод и вывод
Потоки stdin и stdout не используются: считывать ввод и вызывать print() в решении не требуется. Проверяющая система выполняет код ученика, получает из глобального пространства имён классы верхнего уровня CashBid и GoldBill, создаёт их экземпляры и тестирует работу операторов сравнения.
Пример использования
cash = CashBid(40)
bill = GoldBill(40)
print(cash < bill, bill > cash, cash == bill)
print(CashBid.__lt__(cash, bill) is NotImplemented)
Вывод:
True True False True
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Изменение хеша объекта в set: вопрос по Python hash и eq
- NotImplemented в lt: как Python сравнивает объекты
- Сравнение объектов Python: lt и несовместимые группы
- Python set: найдите объекты с изменённым хешем
- Python eq: сравнение объекта с диапазоном допустимых значений
- Удаление ключа из ChainMap в Python: проверка поведения del
