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

⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы. Решения — это последняя инстанция, когда собственные попытки исчерпаны.

⚡ Кратко

  • Задание 1: 1-d, 2-b, 3-a, 4-c.
  • Задание 2: c.
  • Задание 3: True, потому что Dog наследует от Animal.
  • Задание 4: у @classmethod должен быть первый аргумент cls.
  • Задание 5: заменить self.name = name на super().__init__(name).
  • Задание 6: иерархия с super().introduce() в Student.

Решение 1. Сопоставьте принципы ООП

Правильный ответ: 1-d, 2-b, 3-a, 4-c.

  • Наследование — повторное использование кода из базового класса.
  • Полиморфизм — поведение зависит от конкретного подкласса.
  • Инкапсуляция — скрытие внутренней реализации.
  • Абстракция — выделение общих характеристик.

Решение 2. Что делает super()?

Правильный ответ: c — автоматически вызывает метод родителя, учитывая порядок наследования.

Решение 3. Результат isinstance()

Вывод: True.

Почему: Dog наследуется от Animal, поэтому объект Dog является экземпляром и Dog, и Animal.

Решение 4. Найдите ошибку

Ошибка: у классового метода отсутствует обязательный первый аргумент cls.

class Book:
    @classmethod
    def info(cls) -> None:
        print("Книга")


Book.info()

Решение 5. Исправьте код

class Person:
    def __init__(self, name: str) -> None:
        self.name = name


class Student(Person):
    def __init__(self, name: str, course: int) -> None:
        super().__init__(name)
        self.course = course


s = Student("Alice", 2)
print(s.name)    # Alice
print(s.course)  # 2

Логика: super().__init__(name) вызывает инициализацию родителя, поэтому не нужно повторно присваивать self.name.

Решение 6. Иерархия Person → Student / Teacher

class Person:
    def __init__(self, name: str) -> None:
        self.name = name

    def introduce(self) -> None:
        print(f"Hello, my name is {self.name}.")


class Student(Person):
    def __init__(self, name: str, course: int) -> None:
        super().__init__(name)
        self.course = course

    def introduce(self) -> None:
        super().introduce()
        print(f"I'm on course {self.course}.")


class Teacher(Person):
    def __init__(self, name: str, subject: str) -> None:
        super().__init__(name)
        self.subject = subject

    def introduce(self) -> None:
        print(f"Hello, I am professor {self.name}.")
        print(f"My subject is {self.subject}.")


people = [Student("Alice", 2), Teacher("Bob", "Mathematics")]
for person in people:
    person.introduce()

Ожидаемый вывод:

Hello, my name is Alice.
I'm on course 2.
Hello, I am professor Bob.
My subject is Mathematics.

Логика: базовый класс Person задаёт общее поле name и метод introduce(). Student расширяет приветствие через super().introduce(), а Teacher полностью переопределяет вывод. Полиморфизм проявляется в том, что один цикл вызывает разные версии метода.

Проверить по документации: про наследование см. Python Tutorial — Inheritance, про super()Built-in Functions.