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

⚡ Кратко

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

Вопрос 1. Сопоставьте понятия

Верный ответ: 1-b, 2-a, 3-c.

  • Абстрактный класс — класс, от которого нельзя создать объект напрямую.
  • @abstractmethod — помечает метод, который обязательно нужно реализовать.
  • ABC — базовый класс для создания абстрактных классов.

Вопрос 2. Docstrings

Верные ответы: a, b, d.

  • a. Верно — docstring располагается сразу после объявления класса.
  • b. Верно — рекомендуется перечислять атрибуты и методы.
  • c. Неверно — документация методов полезна, но не обязательна.
  • d. Верно — доступ через ClassName.__doc__.

Вопрос 3. Найдите ошибку

Класс Car не реализует обязательный абстрактный метод move(). При попытке создать Car() возникнет TypeError.

class Car(Vehicle):
    def move(self):
        print("Driving")

    def drive(self):
        print("Also driving")

Вопрос 4. Итерация

Верный ответ: a.

  • a. Верно — __next__() должен выбросить StopIteration в конце.
  • b. Неверно — для использования в for объект должен быть итерируемым (обычно через __iter__).

Вопрос 5. Методы сравнения

Верный ответ: 1-a, 2-d, 3-f, 4-b, 5-c, 6-e.

Вопрос 6. __getitem__ и __setitem__

Верные ответы: a, b.

  • a. Верно — __getitem__ работает и с индексами, и с ключами.
  • b. Верно — ключи — частный случай.
  • c. Неверно — для удаления используется __delitem__.
  • d. Неверно — проверку пустых значений нужно писать вручную.

Вопрос 7. Арифметические методы

Верный ответ: 1-d, 2-e, 3-c, 4-b, 5-a.

Вопрос 8. Назначение методов

Верный ответ: 1-b, 2-d, 3-a, 4-c.

Практика 1. Степень числа

class Power:
    def __init__(self, exponent: int) -> None:
        self.exponent = exponent

    def __call__(self, x: float) -> float:
        return x ** self.exponent


if __name__ == "__main__":
    square = Power(2)
    cube = Power(3)
    print(square(4))  # 16
    print(cube(2))    # 8

Практика 2. Журнал оценок

class StudentGrades:
    def __init__(self) -> None:
        self._data: dict[str, list[int]] = {}

    def __setitem__(self, subject: str, grade: int) -> None:
        self._data.setdefault(subject, []).append(grade)

    def __getitem__(self, subject: str) -> list[int]:
        return self._data.get(subject, [])

    def __contains__(self, subject: str) -> bool:
        return subject in self._data

    def __len__(self) -> int:
        return len(self._data)


if __name__ == "__main__":
    grades = StudentGrades()
    grades["Math"] = 5
    grades["Math"] = 3
    grades["Biology"] = 4
    grades["Biology"] = 5
    print("Math in grades:", "Math" in grades)
    print("Total subjects:", len(grades))
    print("Math:", grades["Math"])
    print("Biology:", grades["Biology"])