Функция super() в Python — как вызвать метод родителя

19 июня 2026
Автор

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

Введение

Функция super() в Python — это встроенный инструмент для вызова методов родительского класса из дочернего. Она играет ключевую роль в наследовании, позволяя расширять поведение родителя, а не заменять его полностью. В этой статье мы разберём, как работает super(), как использовать её в конструкторах и методах, а также какие нюансы возникают при множественном наследовании.

Базовое использование super()

Самый частый случай — вызов конструктора родительского класса:

class Animal:
    def __init__(self, name):
        self.name = name
        print(f"Animal создан: {self.name}")


class Dog(Animal):
    def __init__(self, name, breed):
        # Вызываем конструктор родителя
        super().__init__(name)
        self.breed = breed
        print(f"Dog создан: {self.breed}")


dog = Dog("Бобик", "Лабрадор")
# Animal создан: Бобик
# Dog создан: Лабрадор
print(dog.name)   # Бобик
print(dog.breed)  # Лабрадор

Без вызова super().__init__(name) атрибут self.name не был бы создан, потому что конструктор Animal не выполнится автоматически, если Dog определяет свой __init__.

super() в обычных методах

Функция super() работает не только в __init__, но и в любых методах:

class Logger:
    def log(self, message):
        print(f"[BASE] {message}")


class TimedLogger(Logger):
    def log(self, message):
        from datetime import datetime
        timestamp = datetime.now().strftime("%H:%M:%S")
        # Вызываем log() родителя с изменённым сообщением
        super().log(f"{timestamp} — {message}")


class PrefixLogger(TimedLogger):
    def __init__(self, prefix):
        self.prefix = prefix

    def log(self, message):
        # Вызываем log() родителя (TimedLogger), добавляя префикс
        super().log(f"[{self.prefix}] {message}")


logger = PrefixLogger("APP")
logger.log("Сервер запущен")
# [BASE] 12:30:45 — [APP] Сервер запущен

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

Разница между super() и прямым вызовом

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

class Parent:
    def greet(self):
        return "Привет от Parent"


class Child(Parent):
    def greet_with_super(self):
        # Рекомендуемый способ
        return super().greet()

    def greet_direct(self):
        # Работает, но не рекомендуется
        return Parent.greet(self)


child = Child()
print(child.greet_with_super())  # Привет от Parent
print(child.greet_direct())      # Привет от Parent

Преимущества super() перед прямым вызовом:

  • Гибкость — при изменении иерархии наследования не нужно менять вызовы
  • Корректная работа с MRO — при множественном наследовании super() следует правильному порядку разрешения методов
  • Меньше дублирования — имя родительского класса указывается только в определении класса

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

super() при множественном наследовании

При множественном наследовании super() следует MRO (Method Resolution Order):

class A:
    def __init__(self):
        print("A.__init__")
        super().__init__()


class B(A):
    def __init__(self):
        print("B.__init__")
        super().__init__()


class C(A):
    def __init__(self):
        print("C.__init__")
        super().__init__()


class D(B, C):
    def __init__(self):
        print("D.__init__")
        super().__init__()


# Смотрим MRO
print(D.__mro__)
# (<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>)

d = D()
# D.__init__
# B.__init__
# C.__init__
# A.__init__

Обратите внимание: super() в классе B вызывает C.__init__(), а не A.__init__(), потому что в MRO после B идёт C. Каждый конструктор вызывается ровно один раз.

super() с аргументами в Python 2 и Python 3

В Python 3 синтаксис super() был упрощён:

# Python 2 — нужно указывать класс и self
class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()

# Python 3 — достаточно вызвать без аргументов
class Child(Parent):
    def __init__(self):
        super().__init__()

Оба варианта работают в Python 3, но предпочтительнее использовать super() без аргументов — это короче и не требует повторного указания имени класса.

Практический пример: система валидации

Рассмотрим реальный сценарий, где super() помогает строить цепочку валидаторов:

class BaseValidator:
    def validate(self, value):
        # Базовая проверка — значение не None
        if value is None:
            raise ValueError("Значение не может быть None")
        return True


class TypeValidator(BaseValidator):
    def __init__(self, expected_type):
        self.expected_type = expected_type

    def validate(self, value):
        # Сначала выполняем проверку родителя
        super().validate(value)
        if not isinstance(value, self.expected_type):
            raise TypeError(f"Ожидался тип {self.expected_type.__name__}, "
                          f"получен {type(value).__name__}")
        return True


class RangeValidator(TypeValidator):
    def __init__(self, min_val, max_val):
        super().__init__(int)
        self.min_val = min_val
        self.max_val = max_val

    def validate(self, value):
        # Вызываем цепочку: RangeValidator -> TypeValidator -> BaseValidator
        super().validate(value)
        if not (self.min_val <= value <= self.max_val):
            raise ValueError(f"Значение {value} вне диапазона "
                           f"[{self.min_val}, {self.max_val}]")
        return True


# Используем валидатор
validator = RangeValidator(1, 100)

validator.validate(50)   # OK
validator.validate(None)  # ValueError: Значение не может быть None
validator.validate("abc") # TypeError: Ожидался тип int, получен str
validator.validate(200)   # ValueError: Значение 200 вне диапазона [1, 100]

Каждый уровень валидации добавляет свою проверку через super(), формируя надёжную цепочку.

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

  • Забытый super().__init__() — если дочерний класс определяет __init__ без вызова super().__init__(), атрибуты родителя не инициализируются, что приводит к AttributeError при обращении к ним.
  • Несовместимые сигнатуры __init__ — при множественном наследовании все классы в цепочке должны корректно принимать и передавать аргументы. Используйте **kwargs для гибкости.
  • Вызов super() вне метода классаsuper() без аргументов работает только внутри методов класса. В других контекстах нужно указывать аргументы явно.

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

Что произойдёт, если не вызвать super().init() в дочернем классе? Конструктор родителя не будет выполнен. Атрибуты, которые инициализируются в родительском __init__, не будут созданы. При обращении к ним вы получите AttributeError.

Можно ли вызвать super() несколько раз в одном методе? Технически можно, но это плохая практика. Каждый вызов super() возвращает прокси-объект для следующего класса в MRO, и повторный вызов приведёт к повторному выполнению метода родителя.

Как передавать аргументы через super() при множественном наследовании? Лучший подход — использовать **kwargs для передачи именованных аргументов по цепочке, чтобы каждый класс брал нужные ему параметры и передавал остальные дальше.

Заключение

Функция super() — незаменимый инструмент при работе с наследованием в Python. Она обеспечивает корректный вызов методов по цепочке MRO, делает код более гибким и устойчивым к изменениям в иерархии классов. Всегда используйте super() вместо прямого вызова методов родителя.

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

Стрелочка влевоОбработка исключений с помощью try/except в PythonСоздание собственных контекстных менеджеров в PythonСтрелочка вправо

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

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

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

Все гайды по Python

Как отправлять запросы с помощью 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Ведение логов в PythonУдаление данных в Python с помощью removeОбработка исключений с помощью 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
Загрузка данных 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 — примеры и объяснение
Запись данных в PythonУстановка pip в 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Работа с ключами в PythonРабота с координатами X и Y в 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 ₽
Подробнее

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