✅ Решения заданий

⚡ Кратко

Сначала решите задачу самостоятельно. Затем сравните ход решения, найдите отличие и повторите проблемный фрагмент без подсказки.

Решение 1. Безопасная флешка

class SecureUSB:
    def __init__(self, data: str, password: str) -> None:
        self.__data = data
        self.__password = password
        self.__locked = True

    def unlock(self, password: str) -> bool:
        if password == self.__password:
            self.__locked = False
            return True
        return False

    def lock(self) -> None:
        self.__locked = True

    def read(self) -> str:
        if self.__locked:
            raise PermissionError("Access denied")
        return self.__data


usb = SecureUSB("Secret plans", "1234")
print("Device is locked.")
try:
    print(usb.read())
except PermissionError:
    print("Access denied.")

if usb.unlock("1234"):
    print("Access granted.")
    print(f"Data: {usb.read()}")

usb.lock()

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

Решение 2. Данные через свойство

class SecureUSB:
    def __init__(self, data: str, password: str) -> None:
        self.__data = data
        self.__password = password
        self.__locked = True

    def unlock(self, password: str) -> bool:
        if password == self.__password:
            self.__locked = False
            return True
        return False

    def lock(self) -> None:
        self.__locked = True

    @property
    def data(self) -> str:
        if self.__locked:
            raise PermissionError("Access denied")
        return self.__data


usb = SecureUSB("Secret plans", "1234")
try:
    print(usb.data)
except PermissionError:
    print("Device is locked. Access denied.")

usb.unlock("1234")
print("Access granted.")
print(f"Data: {usb.data}")
usb.lock()

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

Решение 3. Викторина

Верные утверждения: a и d.

  • a. Публичные атрибуты доступны везде — верно.
  • b. Защищённые атрибуты технически доступны извне, поэтому утверждение неверно.
  • c. Приватные атрибуты создаются с двумя подчёркиваниями, а не одним.
  • d. Защищённые атрибуты могут использоваться в дочерних классах — верно.

Решение 4. Исправление ошибки

В методе show_title нужно обращаться через self.__title, а не __title. Без self Python ищет локальную или глобальную переменную, которой не существует.

class Book:
    def __init__(self, title: str) -> None:
        self.__title = title

    def show_title(self) -> None:
        print(self.__title)


book = Book("1984")
book.show_title()  # 1984