0Pricing
Python Academy · Урок

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

Переопределяйте методы родительского класса и вызывайте их с помощью super().

«Переопределение методов и super()» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Введение

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

Основы переопределения

Определите в дочернем классе метод с тем же именем, чтобы заменить версию родительского класса для всех экземпляров дочернего класса.
class Greeter:
    def greet(self): return 'Hello'
class FormalGreeter(Greeter):
    def greet(self): return 'Good day'
print(FormalGreeter().greet())

super() при переопределении

super().greet() внутри дочернего класса вызывает версию родительского класса. Это полезно для расширения поведения, а не для его полной замены.
class Logger:
    def log(self, msg): print(f'[LOG] {msg}')
class TimedLogger(Logger):
    def log(self, msg):
        import time
        super().log(f'{time.time():.0f}: {msg}')
TimedLogger().log('test')

super() в __init__

Всегда вызывайте super().__init__() в __init__ дочернего класса, чтобы гарантировать выполнение инициализации родительского класса.
class Animal:
    def __init__(self, name): self.name = name
class Cat(Animal):
    def __init__(self, name, indoor):
        super().__init__(name)
        self.indoor = indoor
cat = Cat('Whiskers', True)
print(cat.name, cat.indoor)

super() с аргументами

super(ChildClass, self) — явная форма записи в стиле Python 2. В Python 3 в большинстве случаев можно использовать super() без аргументов.
class A:
    def greet(self): return 'A'
class B(A):
    def greet(self): return super().greet() + 'B'
class C(B):
    def greet(self): return super().greet() + 'C'
print(C().greet())

Кооперативное наследование

При множественном наследовании super() следует порядку MRO. Вызов super() в каждом классе гарантирует инициализацию всех классов в цепочке.
class A:
    def __init__(self): print('A init')
class B(A):
    def __init__(self): super().__init__(); print('B init')
class C(A):
    def __init__(self): super().__init__(); print('C init')
class D(B, C):
    def __init__(self): super().__init__(); print('D init')
D()

Переопределение __str__

Переопределите __str__ в дочернем классе, чтобы настроить способ вывода экземпляров.
class Animal:
    def __init__(self, name): self.name = name
    def __str__(self): return f'Animal: {self.name}'
class Dog(Animal):
    def __str__(self): return f'Dog: {self.name}'
print(Dog('Rex'))

Шаблонный метод

Родительский класс определяет каркас алгоритма, а дочерний заполняет шаги, переопределяя отдельные методы.
class DataProcessor:
    def process(self):
        data = self.load()
        return self.transform(data)
    def load(self): return [1,2,3]
    def transform(self, d): return d
class Doubler(DataProcessor):
    def transform(self, d): return [x*2 for x in d]
print(Doubler().process())

Вызов метода соседнего класса

С помощью super() и корректного MRO можно вызвать метод соседнего класса при множественном наследовании — это кооперативное использование super().
class A:
    def hello(self): print('A')
class B(A):
    def hello(self): super().hello(); print('B')
class C(A):
    def hello(self): super().hello(); print('C')
class D(B,C):
    def hello(self): super().hello(); print('D')
D().hello()

__init_subclass__

__init_subclass__ вызывается всякий раз, когда от класса создаётся подкласс. Это полезно для схем регистрации расширений.
class Plugin:
    registry = []
    def __init_subclass__(cls, **kw):
        super().__init_subclass__(**kw)
        Plugin.registry.append(cls)
class A(Plugin): pass
class B(Plugin): pass
print([c.__name__ for c in Plugin.registry])

Когда не следует переопределять

Не переопределяйте метод, если нет необходимости менять поведение. Ненужные переопределения усложняют сопровождение. Для несвязанных видов поведения предпочитайте композицию.
# Good: only override what's needed
class Dog(Animal):
    def speak(self): return 'Woof'
    # No need to override __init__ if parent's is fine
print('override guidance')

Быстрая проверка

В Python 3 на что ссылается super() без аргументов внутри метода?

Повторение

Переопределяйте метод, заново определяя его в дочернем классе. super().method() вызывает версию родительского класса. super().__init__() инициализирует родительский класс. Кооперативный super() следует порядку MRO.

Продолжить

Отличный прогресс! Продолжайте, чтобы освоить следующую концепцию.

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

Урок «Переопределение методов и super()» бесплатный?

Да — полный текст урока «Переопределение методов и super()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Переопределение методов и super()»?

Переопределяйте методы родительского класса и вызывайте их с помощью super(). Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Переопределение методов и super()»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Одиночное наследование
  2. Переопределение методов и super()
  3. Множественное наследование и MRO
  4. Полиморфизм и утка типизация
← Назад к Python Academy