JavaRush /Курсы /Модуль 1: Python Core /Инициализация иерархии

Инициализация иерархии

Модуль 1: Python Core
9 уровень , 6 лекция
Открыта

7.1 Метод super()

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

У него есть три основных области применения:

Вызов методов родительского класса:

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

Инициализация базовых классов:

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

Поддержка множественного наследования:

В случае множественного наследования super() правильно разрешает порядок вызовов методов (MRO, Method Resolution Order), что делает его использование предпочтительным перед явным вызовом методов родительских классов. Об этом мы поговорим немного позже.

7.2 Конструктор базового класса

Конструктор базового класса должен быть вызван явно. Кажется, что это происходит автоматически, но на самом деле это не так. Конструкторы базовых классов всегда нужно вызывать явно, так как очень часто в них нужно передать особенные аргументы.

Пример:


class Animal:
    def __init__(self, type, name):
        self.type = type
        self.name = name
         
        
class Dog(Animal):
    def __init__(self, name):
        super().__init__("Собака", name)  # Вызов конструктора базового класса
        
class Cat(Animal):
    def __init__(self, name):
        super().__init__("Кошка", name)  # Вызов конструктора базового класса
        
        
# Создание объекта Dog
dog = Dog("Buddy")
print(dog) 

В этом примере у конструктора базового класса (Animal) два параметра: тип животного и его имя. А у классов-наследников только по одному — только имя.

Именно в конструкторах классов Dog и Cat принимается решение, что именно передать в конструктор базового класса — названия типов животных «Собака» и «Кошка».

Так что:

  • Конструктор базового класса нужно обязательно вызвать в конструкторе класса-наследника.
  • Для этого нужно использовать метод super().
  • Передавать параметр self отдельно не нужно — Python подставит его автоматически при вызове метода.

7.3 Использование метода super()

Метод super() в Python можно использовать не только в конструкторах, но и в других методах классов для вызова методов родительского класса. Это может быть полезно, когда необходимо расширить или модифицировать поведение метода, определённого в родительском классе.

Давайте рассмотрим несколько примеров:

Вызов метода родительского класса в дочернем методе

В этом примере метод speak() в классе Dog сначала вызывает метод speak() из класса Animal с помощью super(), а затем добавляет собственное поведение.


class Animal:
    def speak(self):
        return "Some generic animal sound"
        

class Dog(Animal):
    def speak(self):
        parent_speech = super().speak()  # Вызов метода родительского класса
        return f"{parent_speech} And the dog barks!"
        
dog = Dog()
print(dog.speak())  # Выведет: Some generic animal sound And the dog barks!

Вызов метода родительского класса для проверки состояния

В этом примере метод check_health() в классе Dog вызывает метод check_health() из класса Animal, чтобы добавить дополнительные проверки.


class Animal:
    def check_health(self):
        return "Animal is healthy"
        

class Dog(Animal):
    def check_health(self):
        parent_check = super().check_health()  # Вызов метода родительского класса
        return f"{parent_check}. Dog needs a walk!"
        
dog = Dog()
print(dog.check_health())  # Выведет: Animal is healthy. Dog needs a walk!

Вызов метода родительского класса в методе, изменяющем состояние

В этом примере метод withdraw() в классе SavingsAccount сначала проверяет, не превышен ли лимит на снятие средств, и если нет, вызывает метод withdraw() из класса BankAccount для выполнения операции.


class BankAccount:
    def __init__(self, balance):
        self.balance = balance
        

    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            return f"Withdrew {amount}. New balance: {self.balance}"
        return "Insufficient funds"
        

class SavingsAccount(BankAccount):
    def withdraw(self, amount):
        if amount > 1000:
            return "Withdrawal limit exceeded"
        return super().withdraw(amount)  # Вызов метода родительского класса
        

savings = SavingsAccount(1500)
print(savings.withdraw(500))  # Выведет: Withdrew 500. New balance: 1000
print(savings.withdraw(1500))  # Выведет: Withdrawal limit exceeded
2
Задача
Модуль 1: Python Core, 9 уровень, 6 лекция
Недоступна
Супермашины.
Супермашины.
2
Задача
Модуль 1: Python Core, 9 уровень, 6 лекция
Недоступна
Рычащие.
Рычащие.
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vanil'ka Уровень 25
9 августа 2025
Вы как бы сами придумайте, но должны использоваться три буквы: «Г», «а» и «в». «Г» должна быть первой, «а» — второй, а «в» — последней. А так — можете придумать всё сами. 😆😆
3 августа 2025
Метод speak в классе Dog должен добавлять к строке "Ррррр!" собственное поведение на русском языке, например, "Гав!", а не "пук..."
3 августа 2025
То же самое, Нужно указывать в задании, что слово "например" равносильно прямому указанию. Задание принимается только со словом "Гав!".
Slevin Уровень 64
2 июля 2025
Метод speak в классе Dog должен добавлять к строке "Ррррр!" собственное поведение на русском языке, например, "Гав!", а не "Woof!" Okay... 😣
Станислав Уровень 22
15 марта 2025
Интересный факт, чат GPT предлагает задачи 1 в 1
shinobi Уровень 19
5 августа 2025
Интересный факт, все лекции и примеры с лекций 1в1 совпадает с объяснениями и примерами гемини (нейросетка от гугла)