Наследование — это один из ключевых принципов объектно-ориентированного программирования (ООП),
который позволяет создавать новые классы на основе существующих.
Новый класс (дочерний) наследует атрибуты и методы родительского класса (базового),
что позволяет повторно использовать код и создавать иерархии классов.
Основная задача механизма наследования - избежать дублирования кода.
Вот мы написали два класса Car и Bird, а чем они отличаются?
Почти ничем, кроме того, что птица ещё умеет летать, а коту мы можем добавить ещё какие-то методы, например орать под окнами.
Кроме котов и птиц, мы можем создать приложение зоопарк, где у нас будут десятки животных,
у всех животных будут примерно одинаковые поля и методы.
В итоге, описывая каждого животного, нам придётся написать довольно много повторяющегося кода...
А что если мы создадим общий класс Animal,
запишем в нём основные поля и методы, которые подходят для всех животных. В классах животных укажем лишь то, чем они отличаются.
В итоге мы получим родительский класс Animal и классы животных которые от него наследуются,
т.е. имеют те же атрибуты и методы, что и родительский класс.
class Animal: # Класс, описывающий животное
def __init__(self, nickname, age, breed): # Конструктор
self.nickname = nickname # Кличка животного
self.age = age # Возраст
self.breed = breed # Порода
def nickname(self):
return self.nickname
def speak(self): # Издать звук
print(f"{self.nickname} издает звук.")
class Cat(Animal): # Наследование от класса Animal
def __init__(self, nickname, age, breed):
super().__init__(nickname, age, breed) # Вызов конструктора родительского класса
def run(self):
print(f"{self.nickname} побежал(а)")
class Bird(Animal): # Наследование от класса Animal
def __init__(self, nickname, age, breed):
super().__init__(nickname, age, breed) # Вызов конструктора родительского класса
def fly(self):
print(f"{self.nickname} полетел(а)")
Обратите внимание на сколько сократился код. И при этом вы можете запросто вызывать метод speak(),
и у котика, и у птички, и у других животных, которые будут наследоваться от класса Animal.
Функция super(), которая находится в конструкторе, это вызов родительского конструктора, после этой функции вы можете назначить другие атрибуты, если есть такая необходимость.
Переопределение методов
Дочерний класс может переопределять методы родительского класса, чтобы изменить их поведение.
Пример переопределения:
Переопределим метод speak в классе Cat.
class Animal: # Класс, описывающий животное
def __init__(self, nickname, age, breed): # Конструктор
self.nickname = nickname # Кличка животного
self.age = age # Возраст
self.breed = breed # Порода
def nickname(self):
return self.nickname
def speak(self): # Издать звук
print(f"{self.nickname} издает звук.")
# Класс Cat наследуется от Animal
class Cat(Animal):
def speak(self): # Переопределяем метод
print(f"{self.nickname} мяукает: Мяу-мяу!")
cat = Cat("Барсик", 4, "Дворняга")
cat.speak() # Вывод: Барсик мяукает: Мяу-мяу!
Доступ к методам родительского класса
Если метод переопределен в дочернем классе, но нужно вызвать метод родительского класса, используйте функцию super().
Пример использования super():
Добавим в класс Cat метод speak, который вызывает метод speak родительского класса.
class Animal: # Класс, описывающий животное
def __init__(self, nickname, age, breed): # Конструктор
self.nickname = nickname # Кличка животного
self.age = age # Возраст
self.breed = breed # Порода
def nickname(self):
return self.nickname
def speak(self): # Издать звук
print(f"{self.nickname} издает звук.")
# Класс Cat наследуется от Animal
class Cat(Animal):
def speak(self): # Переопределяем метод
super().speak()
print("А еще он мяукает: Мяу-мяу!")
cat = Cat("Барсик", 4, "Дворняга")
cat.speak() # Барсик издает звук.
#А еще он мяукает: Мяу-мяу!
Множественное наследование
Python поддерживает множественное наследование, когда дочерний класс наследует от нескольких родительских классов.
Синтаксис множественного наследования:
class ParentClass1:
pass
class ParentClass2:
pass
class ChildClass(ParentClass1, ParentClass2):
pass
Пример множественного наследования:
Рассмотрим класс Bird, который умеет летать, и класс Fish, который умеет плавать.
Создадим класс FlyingFish, который наследует оба класса.
class Bird:
def fly(self):
return "Я могу летать!"
class Fish:
def swim(self):
return "Я могу плавать!"
class FlyingFish(Bird, Fish):
pass
flying_fish = FlyingFish()
print(flying_fish.fly()) # Вывод: Я могу летать!
print(flying_fish.swim()) # Вывод: Я могу плавать!
Иерархия классов
Наследование позволяет создавать иерархии классов, где каждый дочерний класс уточняет или расширяет функциональность родительского класса.
Пример иерархии:
Рассмотрим иерархию классов для представления различных типов транспортных средств.
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def info(self):
return f"{self.brand} {self.model}"
class Car(Vehicle):
def drive(self):
return "Еду по дороге."
class Bicycle(Vehicle):
def pedal(self):
return "Кручу педали."
class ElectricCar(Car):
def charge(self):
return "Заряжаю аккумулятор."
car = Car("Toyota", "Corolla")
print(car.info()) # Вывод: Toyota Corolla
print(car.drive()) # Вывод: Еду по дороге.
bicycle = Bicycle("Stels", "Navigator")
print(bicycle.info()) # Вывод: Stels Navigator
print(bicycle.pedal()) # Вывод: Кручу педали.
electric_car = ElectricCar("Tesla", "Model S")
print(electric_car.info()) # Вывод: Tesla Model S
print(electric_car.drive()) # Вывод: Еду по дороге.
print(electric_car.charge()) # Вывод: Заряжаю аккумулятор.
Преимущества наследования
Повторное использование кода: Дочерние классы наследуют функциональность родительских классов.
Расширяемость: Дочерние классы могут добавлять новую функциональность.
Иерархия: Наследование позволяет создавать логические иерархии классов.
Наследование — это мощный инструмент в ООП, который позволяет создавать новые классы на основе существующих, повторно использовать код и строить иерархии классов. В Python поддерживается как одиночное, так и множественное наследование.
Для более глубокого понимания принципа работы наследования, выполняйте практические задания.