🏋️ Раздел тренировки
В этом разделе вы последовательно реализуете магические методы в шести небольших классах.
📂 Подготовка проекта
- Создайте папку урока внутри учебного репозитория:
python-fundamentals-practice/lesson-78/. - Переключитесь на ветку
lesson/78-magic-methods. - Активируйте виртуальное окружение (внешние пакеты не нужны).
- Создайте файл
magic_methods.pyи решайте задания по порядку.
Задание 1. Сравнение книг
Условие: создайте класс Book, который сравнивается по названию. Реализуйте __eq__, __lt__ и __repr__. Проверяйте тип второго операнда через isinstance.
Пример вывода:
True
True
[Book('1984'), Book('1984'), Book('Brave New World')]
Подсказка: если операнд не Book, верните NotImplemented.
Задание 2. Автоматический порядок
Условие: перепишите класс Book из задания 1 с декоратором @total_ordering. Оставьте только __eq__ и __lt__, затем проверьте все шесть операторов сравнения.
Пример вывода:
True
False
True
True
False
True
Подсказка: импортируйте total_ordering из functools и примените декоратор над классом.
Задание 3. Коллекция заметок
Условие: создайте класс Notes:
- ключи автоматически приводятся к нижнему регистру;
- пустые строки не сохраняются — бросается
ValueError; - поддерживаются
notes[key],notes[key] = value,key in notes,len(notes); __str__выводит заметки в читаемом виде.
Подсказка: храните данные во внутреннем словаре _data.
Задание 4. Векторная арифметика
Условие: создайте класс Vector с координатами x и y. Реализуйте:
__add__— сложение двух векторов, возвращает новый объект;__sub__— вычитание двух векторов, возвращает новый объект;__str__— строка вида(x, y).
Подсказка: если other не Vector, верните NotImplemented.
Задание 5. Счётчик с логическим значением
Условие: создайте класс Counter:
__init__(self, value=0);__iadd__— увеличивает значение на месте и возвращаетself;__bool__— возвращаетTrue, если значение больше 0;__str__— строка видаCounter(value).
Подсказка: проверьте, что id объекта не меняется после +=.
Задание 6. Вызываемый конвертер
Условие: создайте класс CurrencyConverter. При инициализации передаётся курс. Объект можно вызвать как функцию: converter(dollars) возвращает произведение.
Дополнительно: реализуйте __bool__, чтобы объект считался ложным при нулевом или отрицательном курсе.
Подсказка: логика конвертации — в методе __call__.