Объяснение к уроку
После этого урока ты сможешь:
super(), когда переопределение должно расширять, а не заменять поведение родителя.Наследование создает связь между типами данных. Полиморфизм позволяет коду работать с разными объектами через общее имя метода. Подкласс переопределяет (overrides) метод, определяя метод с тем же именем. Вызов obj.summary() выполняет реализацию, принадлежащую конкретному объекту.
Это аналог переопределения методов в Java или C# в Python, но тебе не нужно указывать @Override. Сохраняй ожидаемые параметры и возвращаемое поведение, чтобы вызывающей стороне не нужно было знать конкретный подкласс.
Используй super().method(), когда родительский класс уже выполняет полезную работу, которую ты хочешь сохранить. Цикл может обрабатывать различные объекты через единый интерфейс без проверки их типов и дублирования ветвлений.
Подкласс возвращает специализированную метку при вызове того же метода.
class Device:
def status(self):
return "unknown"
class Router(Device):
def status(self):
return "online"
print(Device().status())
print(Router().status())Вывод:
unknown
onlineЦиклу не требуется знать точный подкласс каждого элемента.
class Alert:
def level(self):
return "general"
class WarningAlert(Alert):
def level(self):
return "warning"
class ErrorAlert(Alert):
def level(self):
return "error"
alerts = [WarningAlert(), ErrorAlert(), Alert()]
for alert in alerts:
print(alert.level())Вывод:
warning
error
generalsuper() переиспользует базовое сообщение перед добавлением информации подкласса.
class Build:
def summary(self):
return "Build complete"
class VerifiedBuild(Build):
def summary(self):
return f"{super().summary()} | tests passed"
print(VerifiedBuild().summary())Вывод:
Build complete | tests passedКаждый класс предоставляет метод label(), поэтому вызывающий код может обрабатывать их единообразно.
class Transport:
def label(self):
return "standard"
class ExpressTransport(Transport):
def label(self):
return "express"
def describe(transport):
return f"Shipping: {transport.label()}"
print(describe(ExpressTransport()))Вывод:
Shipping: express| Концепция | Ключевая идея |
|---|---|
| Переопределение метода | Подкласс определяет то же имя метода |
| Полиморфизм | Вызов одного и того же метода у разных типов объектов |
super().method() | Переиспользование реализации родителя |
| Общий интерфейс | Вызывающему коду не нужно ветвиться по каждому типу подкласса |