Наследование в 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.
Отношение «является» (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 различных типов наследования:
Простое наследование: дочерний класс наследует только от одного родительского класса.
Множественное наследование: дочерний класс наследует от нескольких родительских классов.
Многоуровневое наследование: дочерний класс наследует от своего родительского класса, который наследует от своего родительского класса.
Иерархическое наследование: создаётся более одного дочернего класса от одного родительского класса.
Гибридное наследование: комбинирует более одной формы наследования.
Применение наследования
Повторное использование кода: Поскольку дочерний класс может наследовать всю функциональность родительского класса, это позволяет повторно использовать код.
Эффективная разработка: После разработки функциональности мы можем просто унаследовать её, что позволяет писать более чистый код и легче поддерживать его.
Кастомизация: Поскольку мы также можем добавлять собственную функциональность в дочерний класс, мы можем наследовать только полезную функциональность и определять другие необходимые функции.
Смотрите также: