Представьте семейное древо. Ребёнок наследует от родителей черты — цвет глаз, фамилию — но при этом у него есть и свои особенности, и какие-то привычки он делает «по-своему». В ООП так же: дочерний классШаблон для создания объектов: описывает их данные (атрибуты) и поведение (методы). берёт всё от родителя, что-то добавляет своё, а что-то переопределяет. Не нужно заново описывать общие черты — они достаются «по наследству».
Наследование
Наследование позволяет создать новый класс на основе существующего: дочерний класс получает все атрибуты и методыФункция, привязанная к объекту и вызываемая через точку: text.upper(). родителя и может добавлять свои или переопределять чужие. Это избавляет от дублирования.
▶ inheritance.py
Полиморфизм
Полиморфизм («много форм») — один и тот же вызов speak() работает по-разному для разных классов. Метод describe() написан один раз в родителе, но speak() внутри подставляется «правильный» — это и есть сила ООП.
super() — вызов родителя
Если в дочернем классе нужен свой __init__, но при этом и родительский — используют super().
▶ super.py
📝Заметка
super().__init__(...) вызывает конструктор родителя, чтобы не переписывать заново установку name и salary. Это ключевой приём при наследовании — переиспользуем код родителя и дополняем своим.
💡Совет
🔮 Предскажите вывод
Если дочерний класс не переопределяет метод, он берётся у родителя. А если переопределяет — вызовется уже дочерняя версия. Что выведет код ниже?
▶ predict-inherit.py
Ответ — Привет, я звук, затем Привет, я Гав. Метод greet() описан только в родителе, но внутри он зовёт self.speak() — а self у второго объектаКонкретный экземпляр класса — со своими данными. Почти всё в Python является объектом. это Dog, поэтому подставляется переопределённый speak(). Это и есть полиморфизм в действии.
⚠️ Частые ошибки новичков
Частая ошибка — в дочернем __init__ завести свои атрибуты, но забыть вызвать super().__init__(). Тогда родительские атрибуты (name, salary) не создаются, и обращение к ним падает с AttributeError. Запустите код и добавьте недостающий вызов super().
▶ broken-super.py
Заданиерешение.py
Есть класс Shape с методом area(), возвращающим 0. Создайте дочерний класс Square с конструктором (side), который переопределяет area() и возвращает площадь квадрата.
Заданиерешение.py
Доп. задача. Есть базовый класс Person с конструктором (name). Создайте дочерний Student(Person) с конструктором (name, group): вызовите super().__init__(name) и добавьте self.group. Метод info() должен вернуть строку вида "Аня, группа A-1".
❓Проверь себя
Что делает super().__init__() в дочернем классе?
Что такое полиморфизм в ООП?
Что произойдёт, если дочерний __init__ не вызовет super().__init__()?
ℹ️Важно
✅ Что вы узнали
Наследование (семейное древо) даёт дочернему классу все методы и атрибуты родителя.
Дочерний класс может переопределять методы — вызовется его версия.
Полиморфизм: один вызов (speak()) ведёт себя по-разному для разных классов.
super().__init__(...) переиспользует конструктор родителя; забыть его — частая ошибка.
Комментарии
Загрузка…
Загрузка комментариев…