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

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

  • Задание 1 — создать класс Door с проверкой кода.
  • Задание 2 — добавить смену кода без дублирования проверки.
  • Задание 3 — добавить временную блокировку после неудачных попыток.
  • Задание 4 — заменить сообщения при блокировке на исключение DoorBlockedError.

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

В этом разделе вы пошагово выполните практическое задание: от создания файла до рабочего класса Door.

Цель тренировки: научиться самостоятельно проектировать класс, выбирать приватные и публичные члены и не дублировать логику.

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

  1. Создайте папку урока внутри учебного репозитория: python-fundamentals-practice/lesson-77/.
  2. Переключитесь на ветку lesson/77-door-code.
  3. Активируйте виртуальное окружение (для этого урока внешние пакеты не нужны).
  4. Создайте файл door.py.

Задание 1. Класс Door

Условие: создайте класс Door, представляющий электронную дверь. При создании передаётся первоначальный код доступа. Есть метод unlock(code), который разрешает доступ при правильном коде и отклоняет при неверном. Продумайте, какие поля и методы следует скрыть от внешнего доступа, а какие оставить открытыми.

Пример вывода:

Access denied.
Access granted.

Подсказка: код доступа должен храниться в приватном атрибуте. Метод проверки кода можно вынести в приватный метод, чтобы потом переиспользовать его.

Задание 2. Смена кода

Условие: доработайте класс Door. Добавьте метод для смены кода. Новый код можно установить только после проверки текущего кода. Логика проверки корректности кода не должна дублироваться.

Пример вывода:

Access denied. Code not changed.
Code changed.
Access denied.
Access granted.

Подсказка: используйте тот же приватный метод __is_valid_code, что и в unlock.

Задание 3. Блокировка двери

Условие: доработайте класс Door.

  • При создании можно указать максимальное количество попыток (по умолчанию 3) и время блокировки в минутах (по умолчанию 15).
  • Если попытки исчерпаны, дверь блокируется на указанное время.
  • Пока дверь заблокирована — сменить код или открыть нельзя.
  • Неверные попытки входа или смены кода учитываются общим счётчиком.
  • При блокировке должно выводиться сообщение с указанием оставшегося времени ожидания.

Пример вывода:

Access denied.
Access denied. Code not changed.
Too many failed attempts. Door is blocked. Try again in 0 min 2 sec.
Door is blocked. Try again in 0 min 2 sec.
Access granted.

Подсказка: храните __block_until как объект datetime. Для подсчёта оставшихся минут и секунд используйте divmod.

Задание 4. Исключение при блокировке

Условие: доработайте класс Door.

  • Создайте пользовательское исключение DoorBlockedError.
  • При попытке открыть дверь или сменить код во время блокировки выбрасывайте это исключение вместо вывода сообщения.
  • Обработайте исключение в коде вызова.

Подсказка: пусть приватный метод формирует строку с оставшимся временем и передавайте её в конструктор исключения. В вызывающем коде используйте try...except DoorBlockedError.

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

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

Вопрос 1

Что важнее всего в практическом задании?

Вопрос 2

Как безопаснее двигаться в практикуме?

Вопрос 3

Что делать, если решение не совпадает с ожидаемым результатом?

Вопрос 4

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

Вопрос 5

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

Вопрос 6

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