✅ Ответы на вопросы
⚡ Кратко
Сначала решите задачу самостоятельно. Затем сравните ход решения, найдите отличие и повторите проблемный фрагмент без подсказки.
Вопрос 1. MRO
Верный ответ: c. D → B → C → A → object.
Python использует обход в глубину слева направо. Сначала идёт B и его предок A, но так как C тоже наследует от A, общий предок A откладывается и проверяется после C.
Вопрос 2. Ошибка в коде
У объекта user отсутствует атрибут username. Миксин пытается использовать его без проверки.
Исправление:
class AuthMixin:
def login(self) -> None:
if not hasattr(self, "username"):
raise AttributeError("Не задан username")
print(f"{self.username} вошёл.")
class User(AuthMixin):
def __init__(self, username: str) -> None:
self.username = username
user = User("alice")
user.login()
Вопрос 3. hasattr()
hasattr(obj, "name") возвращает True, если у объекта есть атрибут с именем name. Пример в миксине:
class GreetMixin:
def greet(self) -> None:
if not hasattr(self, "name"):
raise AttributeError("Нет имени")
print(f"Привет, {self.name}!")
Вопрос 4. Уровни доступа
Верные ответы: b и c.
- a. Неверно — миксин обычно не определяет
__init__(). - b. Верно —
super()следует MRO. - c. Верно — ближайший родитель выигрывает при конфликте имён.
- d. Неверно —
super()обращается к следующему классу в MRO, не обязательноobject.
Вопрос 5. Агрегация
Верный ответ: b. Внутренний элемент создаётся отдельно и передаётся извне.