Наследование классов в Python — основы и примеры

19 июня 2026
Автор

Антон Ларичев

Введение

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

В этой статье мы разберём, как работает наследование классов в Python, как создавать дочерние классы, переопределять методы и использовать полиморфизм.

Базовый синтаксис наследования

Для создания дочернего класса достаточно указать родительский класс в скобках после имени нового класса:

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

    def speak(self):
        return f"{self.name} издаёт звук"


class Dog(Animal):
    # Dog наследует все атрибуты и методы Animal
    pass


# Создаём экземпляр дочернего класса
dog = Dog("Бобик")
print(dog.speak())  # Бобик издаёт звук

Класс Dog автоматически получает конструктор __init__ и метод speak от класса Animal. Никакого дополнительного кода писать не нужно.

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

Дочерний класс может изменить поведение методов родителя, определив метод с тем же именем:

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

    def speak(self):
        return f"{self.name} издаёт звук"


class Dog(Animal):
    def speak(self):
        # Переопределяем метод родителя
        return f"{self.name} говорит: Гав!"


class Cat(Animal):
    def speak(self):
        # Каждый дочерний класс может иметь свою реализацию
        return f"{self.name} говорит: Мяу!"


dog = Dog("Бобик")
cat = Cat("Мурка")

print(dog.speak())  # Бобик говорит: Гав!
print(cat.speak())  # Мурка говорит: Мяу!

При вызове метода Python сначала ищет его в дочернем классе. Если метод найден — используется он, если нет — Python обращается к родительскому классу.

Расширение функциональности дочернего класса

Дочерний класс может добавлять собственные атрибуты и методы, расширяя возможности родителя:

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

    def info(self):
        return f"{self.name}, возраст: {self.age}"


class Dog(Animal):
    def __init__(self, name, age, breed):
        # Вызываем конструктор родителя
        super().__init__(name, age)
        # Добавляем новый атрибут
        self.breed = breed

    def info(self):
        # Расширяем метод родителя
        base_info = super().info()
        return f"{base_info}, порода: {self.breed}"


dog = Dog("Бобик", 3, "Лабрадор")
print(dog.info())  # Бобик, возраст: 3, порода: Лабрадор

Функция super() позволяет вызывать методы родительского класса из дочернего. Это удобно, когда вам нужно сохранить логику родителя и добавить к ней что-то новое.

Хотите глубже разобраться в объектно-ориентированном программировании на Python и освоить продвинутые паттерны? Если вы хотите детальнее изучить ООП и наследование — приходите на наш большой курс Основы Python. На курсе 210 уроков и 180 упражнений, AI-тренажёры для практики 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Полиморфизм через наследование

Полиморфизм позволяет работать с объектами разных классов через единый интерфейс:

class Shape:
    def area(self):
        raise NotImplementedError("Метод area() должен быть переопределён")


class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height


class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        import math
        return math.pi * self.radius ** 2


# Единый интерфейс для разных фигур
shapes = [Rectangle(5, 3), Circle(4), Rectangle(2, 7)]

for shape in shapes:
    # Вызываем один и тот же метод у разных объектов
    print(f"Площадь: {shape.area():.2f}")

Каждый объект вызывает свою реализацию метода area(), хотя мы обращаемся к ним одинаково.

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

Python предоставляет встроенные функции для проверки отношений наследования:

class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()

# Проверяем, является ли объект экземпляром класса
print(isinstance(dog, Dog))     # True
print(isinstance(dog, Animal))  # True

# Проверяем, является ли класс наследником другого
print(issubclass(Dog, Animal))  # True
print(issubclass(Animal, Dog))  # False

Функция isinstance() проверяет, принадлежит ли объект к классу или его наследникам. Функция issubclass() проверяет отношение наследования между классами.

Частые ошибки

  • Забыли вызвать super().__init__() — если дочерний класс определяет свой __init__, но не вызывает конструктор родителя, атрибуты родителя не будут инициализированы.
  • Неправильный порядок аргументов при вызове super() — в Python 3 достаточно писать super() без аргументов, но убедитесь, что передаёте все необходимые параметры в метод родителя.
  • Путаница между переопределением и расширением — если нужно сохранить поведение родителя и добавить новое, используйте super(). Если нужно полностью заменить — просто определите метод заново.

Частозадаваемые вопросы

Можно ли наследоваться от нескольких классов одновременно? Да, Python поддерживает множественное наследование. Для этого перечислите родительские классы через запятую: class Child(Parent1, Parent2). Однако множественное наследование может усложнить код, поэтому используйте его с осторожностью.

Чем отличается isinstance() от type()? Функция type() возвращает точный тип объекта, тогда как isinstance() учитывает всю цепочку наследования. Для проверки типа при наследовании лучше использовать isinstance().

Можно ли запретить наследование от класса? В Python нет встроенного механизма для запрета наследования, как final в Java. Однако можно реализовать это через метаклассы, хотя на практике такое встречается редко.

Заключение

Наследование в Python — это мощный инструмент, позволяющий переиспользовать код, расширять функциональность и строить гибкую архитектуру приложений. Мы рассмотрели базовый синтаксис, переопределение методов, полиморфизм и проверку отношений наследования.

Для закрепления навыков ООП и наследования в Python рекомендуем курс Основы Python. В первых 3 модулях курса доступно бесплатное содержание, что позволяет освоить базовые конструкции языка и понять структуру курса до покупки полного доступа.

Стрелочка влевоОписание объектов PythonМножественное наследование в Python — примеры и MROСтрелочка вправо

Постройте личный план изучения Python до уровня Middle — бесплатно!

Python — часть карты развития Backend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Python

Ведение логов в PythonУдаление данных в Python с помощью removeВвод целого числа в PythonОбработка исключений с помощью try/except в PythonФункция super() в Python — как вызвать метод родителяСоздание собственных контекстных менеджеров в PythonРабота с символами программирования PythonРабота с переменной X в PythonРабота с классами в PythonКак скачать Python на компьютерПростая программа на Python для начинающихОсновы Python для тех, кто начинаетЧто нового в Python 3Поддерживается ли Python 2 и стоит ли его использоватьPython 1 — с чего начиналась история языкаКоманда python print - полное руководство по выводу данныхПравила именования переменных в PythonПользовательские исключения в PythonОсновы Python coreОписание объектов PythonНаследование классов в Python — основы и примерыМножественное наследование в Python — примеры и MROКонтекстный менеджер with в Python — как работает и зачем нуженКомментарии в Python — однострочные, многострочные и docstringКакой Python выбрать для установкиКак вывести целое число с помощью print в PythonКак установить Python на Windows macOS и LinuxКак пользоваться консолью PythonКак получить последний элемент в PythonКак найти значение в PythonКак настроить PythonКак использовать print для строк в PythonКак работает интерпретатор PythonИнструкция по работе с PythonБлок finally в обработке исключений PythonЦелые числа в PythonАбстрактные классы в Python — ABC и abstractmethod
Как отправлять запросы с помощью requests в PythonПочему Python выводит значение без команды printКак работает команда print в PythonВозможности Python для автоматизации задачРабота с JSON в Python на примерахPython get — методы получения данныхКак находить и исправлять ошибки в PythonРабота с данными через API и внешние сервисыСтруктура и оформление кода PythonОсновы Django с PythonПолезные приёмы в Python для повседневной работыИспользование locals в Python для отладкиИнтеграция PHP и PythonКак выполнять HTTPS-запросы в PythonFastAPI Python — быстрый старт: создание REST API с нуляКак работать с API в Python
Загрузка данных PythonУправление проектами на GitHub с PythonСоздание веб-приложений на Flask PythonСоздание бота на PythonСоздание интерфейсов Python QTСоздание игр с PygameСоздание GUI в PythonКак работать со словарями в PythonРабота с библиотеками через Python PackagingРабота со временем в Python при помощи модуля timePython name — особенности переменнойМатематические операции в Python с модулем mathPython listing — что это и как использоватьPytest — тестирование на Python: полное руководствоОбработка изображений с OpenCV PythonNumPy в Python — основы и применение в задачахМашинное обучение с PythonИспользование Anaconda с PythonМодуль contextlib в Python — утилиты для контекстных менеджеровБиблиотеки Python и их применение в проектах
Вложенные функции в PythonВозврат значений из функции в PythonСоздание собственных декораторов в PythonРабота с функцией map в PythonЦикл while в Python и примеры использованияОбработка чисел, введённых через input в PythonОсновные операторы в Python с примерамиУсловные выражения if else в Python для начинающихКак выполняется вызов функций call в PythonПродвинутые генераторы в Python — send, throw, close и корутиныПозиционные и именованные аргументы в PythonОбъявление переменных и управление областью видимости в PythonПередача аргументов по ссылке и по значению в PythonПередача аргументов через args и kwargs в PythonОсновные методы Python и примеры их использованияОператор match/case в Python 3.10+ — основы структурного сопоставленияПаттерны match/case в Python — деструктуризация, guard и вложенные шаблоныПрактические примеры match/case в Python — реальные сценарии примененияЛокальные и глобальные переменные в PythonЧасто используемые команды PythonКлючевые слова global и nonlocal в PythonКак создавать функции в PythonКак работает сборщик мусора в PythonКак работает область видимости переменных в PythonКак работает функция callable в PythonКак работает функция any и all в PythonКак проверить тип переменной в PythonКак передать функцию как аргумент в PythonКак использовать функцию isinstance в PythonКак использовать функцию filter в PythonКак использовать функцию filter в PythonКак использовать функцию eval безопасно в PythonКак использовать декораторы в PythonИзменяемые и неизменяемые типы данных в PythonГенераторы и yield в Python — как создавать и использоватьГенераторные выражения в Python — синтаксис и примерыФункции в Python и способы их вызоваФункции как объекты в PythonЧто такое замыкания в PythonЧто делает функция reduce в PythonЧто делает функция id в PythonАргументы по умолчанию в PythonАнонимные функции и lambda в PythonАлгоритмы на Python — примеры и объяснение
Установка pip в PythonЗапись данных в PythonУправление зависимостями requirement в PythonУправление библиотеками с помощью Python PackagingУдаление пробелов с помощью strip в PythonСтруктурирование кода в PythonСоздание исполняемого файла Python в exeРазбор traceback в модуле PythonРазбор site-packages в PythonРазбор Program Files в PythonРабота с Unicode кодировками в PythonРабота с системными функциями Python sysРабота с папкой AppData в PythonРабота с модулем logging в PythonРабота с каталогами в PythonРабота с CSV в PythonВиртуальная среда venv в Python — создание и настройкаКак создать простое приложение на PythonИспользование pip в Python для установки пакетовМодули в Python и организация кода в проектеИмпорт модулей в Python и правила подключенияРабота с файлами в Python пошаговоЧто делает компилятор Python и как он работаетПолучение строки из модуля PythonПодключение файлов в Python с includeПеременные среды в PythonСборка проекта с помощью packaging в PythonНастройка Python сервераИспользование Python на UbuntuИспользование консоли PythonИспользование кодировок в PythonИнициализация пакетов PythonИмпорт модулей PythonИмпорт имен в PythonСреда IDLE Python и базовые возможностиЧтение и запись TXT в PythonЧтение файлов в Python с помощью open file
Удаление элементов из списка PythonТипы данных в Python — обзор и рекомендацииОсновные операции со строками в PythonМетоды str в Python и обработка текстаСписки в Python и их ключевые методыСоздание списков данных в PythonРабота со строками и символами в PythonРабота со столбцами в PythonРабота со списком значений в PythonРабота с таблицами в Python с помощью DataFrameРабота с RFR в PythonРабота с пробелами в PythonРабота с массивами в PythonРабота с кортежами tuple PythonРабота с координатами X и Y в PythonРабота с ключами в PythonРабота с элементами данных PythonРабота с двоичными числами PythonРабота с данными в PythonРабота с данными NumPy PythonРабота с большими числами в PythonРабота с битами в PythonРабота с байтами в PythonЧто такое значение в Python и как его определитьМножества в Python и операции с нимиИспользование range в Python для цикловПроверка на четность в PythonПроверка числа в PythonПреобразование типов в PythonПреобразование списка в строку PythonПреобразование числа в строку в PythonПостроение графиков в PythonОпределение индекса элемента в PythonОкругление чисел в PythonОбъединение списков в Python с помощью zipМножества в PythonМассивы в Python и отличие от списковМассив чисел в PythonКортежи данных в PythonКак вычислить сумму чисел в PythonКак получить остаток от деления в PythonКак найти следующее число в PythonИспользование Unicode в PythonТип int в Python и его особенностиИндекс списка в PythonФункции для работы со строками в PythonЭлементы Python и способы доступа к нимДоступ к элементам массива в PythonДеление чисел в PythonРабота с данными в Python на практикеКак работать с числами в Python
Открыть базу знаний

Лучшие курсы по теме

Иконка молнииНовый
изображение курса

Основы Python

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажерыAI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий