📝 Практические задания

⚡ Задания в двух словах

  • Задание 1 — сравнение книг через __eq__ и __lt__.
  • Задание 2 — автоматический порядок через @total_ordering.
  • Задание 3 — коллекция заметок с индексацией и фильтрацией.
  • Задание 4 — векторная арифметика.
  • Задание 5 — изменяемый счётчик и логическое значение.
  • Задание 6 — вызываемый конвертер валют.

🏋️ Раздел тренировки

В этом разделе вы последовательно реализуете магические методы в шести небольших классах.

Цель тренировки: научиться выбирать нужный dunder-метод, проверять тип операнда и не смешивать «создание нового объекта» с «изменением на месте».

📂 Подготовка проекта

  1. Создайте папку урока внутри учебного репозитория: python-fundamentals-practice/lesson-78/.
  2. Переключитесь на ветку lesson/78-magic-methods.
  3. Активируйте виртуальное окружение (внешние пакеты не нужны).
  4. Создайте файл 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__.

Проверка понимания

Выберите один вариант ответа. После клика правильный ответ подсветится зелёным.

Вопрос 1

Что такое класс?

Вопрос 2

Что означает self?

Вопрос 3

Какой стиль имён переменных обычно рекомендует PEP 8?

Вопрос 4

Зачем использовать f-strings в современном Python?

Вопрос 5

Когда полезен ранний возврат из функции?

Вопрос 6

Что делает аннотация типа в Python?

Вопрос 7

Как лучше обрабатывать ожидаемую ошибку преобразования?