✅ Решения заданий
⚡ Кратко
Сначала решите задачу самостоятельно. Затем сравните ход решения, найдите отличие и повторите проблемный фрагмент без подсказки.
Решение 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