Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Наследование — одна из ключевых концепций объектно-ориентированного программирования (ООП).
Оно позволяет одному классу (называемому дочерним или подклассом) наследовать атрибуты и методы другого класса (называемого родительским или суперклассом).

Это означает, что можно определить общее поведение и данные в базовом классе, а затем создавать более специализированные классы, которые повторно используют и настраивают эту функциональность — без необходимости переписывать один и тот же код.


Основной синтаксис наследования

В Python наследование реализуется указанием имени родительского класса в скобках после имени дочернего класса.

class ParentClass:
    # Атрибуты и методы родительского класса

class ChildClass(ParentClass):
    # Атрибуты и методы дочернего класса

Когда дочерний класс наследуется от родительского, он получает:

  • Все атрибуты родителя (переменные, связанные с объектом)
  • Все методы родителя (функции, связанные с объектом)
  • Любой конструктор (__init__), который может быть у родительского класса

Пример: Животные и звуки

Давайте оживим наследование на примере, который всем понятен — животные.
Начнём с общего класса Animal, в котором определено, что есть общего у всех животных, а затем создадим конкретные типы животных (Dog и Cat), которые разделяют эти черты, но издают разные звуки.

Вот базовый класс:

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def sound(self):
        pass  # Каждое конкретное животное задаст свой звук

В классе Animal есть:

  • Метод __init__, который задаёт name и age для каждого животного.
  • Метод sound(), который пока ничего не делает (pass — заглушка). В каждом конкретном классе животного он будет переопределён звуком соответствующего вида.

Теперь создадим два конкретных класса животных:

class Dog(Animal):
    def sound(self):
        print("Woof woof!")

class Cat(Animal):
    def sound(self):
        print("Meow!")

Что здесь происходит:

  • И Dog, и Cat наследуют от Animal, поэтому автоматически получают атрибуты name и age без переписывания кода.
  • Каждый из них переопределяет метод sound(), чтобы издавать свой уникальный звук.

Создание и использование объектов

dog = Dog("Rex", 2)
cat = Cat("Mimi", 3)

print(dog.name)  # Rex
dog.sound()      # Woof woof!

print(cat.name)  # Mimi
cat.sound()      # Meow!

Когда мы создаём Dog("Rex", 2), происходит следующее:

  1. Python вызывает метод __init__ из Animal (так как у Dog своего нет).
  2. Значения name и age сохраняются в новом объекте.
  3. При вызове dog.sound() Python сначала ищет метод sound() в Dog. Там он его находит и выполняет — выводя "Woof woof!".

Такая же логика действует для Cat, только вызывается его собственный метод sound().


Этот пример показывает магии наследования:

  • Общая инициализация (__init__) пишется один раз в классе Animal.
  • Каждый подкласс (Dog, Cat) сохраняет общие черты и добавляет уникальное поведение.
  • В итоге меньше повторяющегося кода, логика становится организованнее, и проще управлять связанными объектами.

3. Как это работает

  • Общая структура: метод __init__ из Animal запускается при создании объекта Dog или Cat, так как они наследуют его автоматически.
  • Переопределение методов: у Dog и Cat есть свои методы sound(), которые заменяют (override) заглушку из Animal. При вызове sound() для Dog используется метод из Dog, а не из Animal.
СОВЕТ: Если дочерний класс не переопределяет метод, используется метод родителя по умолчанию.

Зачем использовать наследование?

Наследование позволяет:

  • Избежать повторения кода, вынеся общую логику в один базовый класс.
  • Сделать код более модульным и удобочитаемым.
  • Создавать специализированные классы, исходя из общей схемы.

Пример мышления с наследованием:

  • Animal → общий шаблон с name, age и методом sound().
  • Dog → конкретный тип животного со своим уникальным звуком.
  • Cat → другой конкретный тип животного с отличным звуком.

Итог

Наследование — это мощный инструмент ООП для создания иерархий классов, начиная с общих концепций и переходя к более специализированным.

В Python оно реализуется так:

  1. Определяете родительский класс с общими атрибутами и методами.
  2. Создаёте дочерние классы, указывая имя родителя в скобках.
  3. Добавляете или переопределяете методы в дочерних классах по необходимости.

В следующем уроке мы углубимся в эту тему, изучив super() — способ для дочерних классов вызывать и расширять поведение родительских.