Наследование в Python

Будучи объектно-ориентированным языком, Python поддерживает наследование классов. Это позволяет нам создавать новый класс из существующего.

  • Вновь созданный класс называется подклассом (дочерним или производным классом).

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


Синтаксис наследования в Python

# define a superclass
class super_class:
    # attributes and method definition

# inheritance
class sub_class(super_class):
    # attributes and method of super_class
    # attributes and method of sub_class

Здесь мы наследуем sub_class от super_class.

Примечание

Прежде чем двигаться дальше с наследованием, убедитесь, что вы знаете, как работают классы и объекты Python.


Пример: Наследование в Python

class Animal:

    # attribute and method of the parent class
    name = ""

    def eat(self):
        print("I can eat")

# inherit from Animal
class Dog(Animal):

    # new method in subclass
    def display(self):
        # access name attribute of superclass using self
        print("My name is ", self.name)

# create an object of the subclass
labrador = Dog()

# access superclass attribute and method
labrador.name = "Rohu"
labrador.eat()

# call subclass method
labrador.display()

Вывод

I can eat
My name is  Rohu

В приведённом выше примере мы получили подкласс Dog от суперкласса Animal. Обратите внимание на операторы:

labrador.name = "Rohu"

labrador.eat()

Здесь мы используем labrador (объект Dog) для доступа к name и eat() класса Animal.

Это возможно потому, что подкласс наследует все атрибуты и методы суперкласса.

Также мы получили доступ к атрибуту name внутри метода класса Dog, используя self.

Реализация наследования в Python

Отношение «является» (is-a)

Наследование — это отношение является. То есть мы используем наследование только в том случае, если между двумя классами существует отношение является. Например:

  • Машина является транспортным средством

  • Яблоко является фруктом

  • Кошка является животным

Здесь Машина может наследоваться от Транспортного средства, Яблоко может наследоваться от Фрукта и т.д.


Переопределение методов в наследовании Python

В предыдущем примере мы видим, что объект подкласса может обращаться к методу суперкласса.

Однако что, если один и тот же метод присутствует и в суперклассе, и в подклассе?

В этом случае метод в подклассе переопределяет метод в суперклассе. Эта концепция известна как переопределение методов в Python.

Пример: Переопределение методов

class Animal:

    # attributes and method of the parent class
    name = ""

    def eat(self):
        print("I can eat")

# inherit from Animal
class Dog(Animal):

    # override eat() method
    def eat(self):
        print("I like to eat bones")

# create an object of the subclass
labrador = Dog()

# call the eat() method on the labrador object
labrador.eat()

Вывод

I like to eat bones

В приведённом выше примере один и тот же метод eat() присутствует как в классе Dog, так и в классе Animal.

Теперь, когда мы вызываем метод eat() с использованием объекта подкласса Dog, вызывается метод класса Dog.

Это потому, что метод eat() подкласса Dog переопределяет тот же метод суперкласса Animal.


Функция super() в наследовании

Ранее мы видели, что тот же метод (функция) в подклассе переопределяет метод в суперклассе.

Однако, если нам нужно получить доступ к методу суперкласса из подкласса, мы используем функцию super(). Например:

class Animal:

    name = ""

    def eat(self):
        print("I can eat")

# inherit from Animal
class Dog(Animal):

    # override eat() method
    def eat(self):

        # call the eat() method of the superclass using super()
        super().eat()

        print("I like to eat bones")

# create an object of the subclass
labrador = Dog()

labrador.eat()

Вывод

I can eat
I like to eat bones

В приведённом выше примере метод eat() подкласса Dog переопределяет тот же метод суперкласса Animal.

Внутри класса Dog мы использовали:

# call method of superclass
super().eat()

для вызова метода eat() суперкласса Animal из подкласса Dog.

Поэтому, когда мы вызываем метод eat() через объект labrador:

# call the eat() method
labrador.eat()

Выполняются обе версии метода eat() — переопределённая и версия суперкласса.


Подробнее о наследовании в Python

Типы наследования

В Python существует 5 различных типов наследования:

  • Простое наследование: дочерний класс наследует только от одного родительского класса.

  • Множественное наследование: дочерний класс наследует от нескольких родительских классов.

  • Многоуровневое наследование: дочерний класс наследует от своего родительского класса, который наследует от своего родительского класса.

  • Иерархическое наследование: создаётся более одного дочернего класса от одного родительского класса.

  • Гибридное наследование: комбинирует более одной формы наследования.

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

  • Повторное использование кода: Поскольку дочерний класс может наследовать всю функциональность родительского класса, это позволяет повторно использовать код.

  • Эффективная разработка: После разработки функциональности мы можем просто унаследовать её, что позволяет писать более чистый код и легче поддерживать его.

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


Смотрите также:

Видео: Наследование в Python