🏋️ Раздел тренировки
В этом разделе вы пошагово выполните практическое задание: от создания файла до рабочего класса Door.
📂 Подготовка проекта
- Создайте папку урока внутри учебного репозитория:
python-fundamentals-practice/lesson-77/. - Переключитесь на ветку
lesson/77-door-code. - Активируйте виртуальное окружение (для этого урока внешние пакеты не нужны).
- Создайте файл
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.