✅ Ответы на вопросы

⚡ Кратко

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

Вопрос 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. Внутренний элемент создаётся отдельно и передаётся извне.