Объяснение к уроку
super()После этого урока ты сможешь:
super().__init__(...) для инициализации унаследованного состояния перед добавлением новых атрибутов.super().method(...) вместо копирования его логики.Наследование позволяет одному классу повторно использовать поведение другого. Укажи родительский класс в круглых скобках:
class Job:
pass
class SpecialJob(Job):
passПодкласс наследует доступные методы и атрибуты от своего родителя. Он также может определять собственные атрибуты и методы. Когда подкласс определяет собственный __init__, инициализатор родителя не вызывается автоматически. Вызови super().__init__(...), чтобы инициализировать атрибуты родителя перед добавлением новых.
Вспомогательная функция super() также позволяет переопределяющему методу экземпляра вызывать реализацию родителя. Это позволяет избежать дублирования работающего базового поведения. Следующий урок будет подробно посвящен переопределению методов и полиморфизму; пока используй переопределение только тогда, когда требуется расширить то, что родитель уже делает.
Подкласс может вызывать метод родителя, даже если сам не определяет этот метод.
class Device:
def __init__(self, identifier):
self.identifier = identifier
def label(self):
return f"Device {self.identifier}"
class Laptop(Device):
pass
print(Laptop("A14").label())Вывод:
Device A14Laptop унаследовал метод label() от класса Device.
Используй super().__init__, чтобы сохранить настройку родителя в неизменном виде.
class Account:
def __init__(self, owner):
self.owner = owner
class PremiumAccount(Account):
def __init__(self, owner, credits):
super().__init__(owner)
self.credits = credits
print(f"{PremiumAccount('Noor', 50).owner}: premium")Вывод:
Noor: premiumРодитель создает owner; потомок добавляет credits.
super()Потомок может повторно использовать результат родителя и добавить к нему собственную информацию.
class Message:
def __init__(self, text):
self.text = text
def summary(self):
return self.text
class UrgentMessage(Message):
def summary(self):
return f"URGENT: {super().summary()}"
print(UrgentMessage("Restart required").summary())Вывод:
URGENT: Restart requiredПереопределенный метод вызывает метод родителя, а не переписывает его логику заново.
Унаследованные методы можно вызывать на различных подклассах или экземплярах родителя.
class Counter:
def __init__(self, value):
self.value = value
def double(self):
return self.value * 2
class LabeledCounter(Counter):
def __init__(self, value, label):
super().__init__(value)
self.label = label
print(LabeledCounter(7, "items").double())Вывод:
14Подкласс добавляет label, не теряя метод double() родительского класса.
| Цель | Python |
|---|---|
| Наследовать от родителя | class Child(Parent): |
| Запустить инициализатор родителя | super().__init__(...) |
| Расширить родительский метод | super().method(...) |
| Оставить поведение родителя без изменений | Не переопределять этот метод |
__init__ в дочернем классе с пропуском инициализации атрибутов родителя.self вручную в super().__init__.super().