Основы Python: Объектно-ориентированное программирование (ООП)
Введение в наследование
Lesson 3 of 7 • 10 XP
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), происходит следующее:
- Python вызывает метод
__init__изAnimal(так как уDogсвоего нет). - Значения
nameиageсохраняются в новом объекте. - При вызове
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 оно реализуется так:
- Определяете родительский класс с общими атрибутами и методами.
- Создаёте дочерние классы, указывая имя родителя в скобках.
- Добавляете или переопределяете методы в дочерних классах по необходимости.
В следующем уроке мы углубимся в эту тему, изучив super() — способ для дочерних классов вызывать и расширять поведение родительских.