Українська
Наслідування та поліморфізм
Наслідування та базовий клас
Наслідування (inheritance) створює похідний клас на основі наявного. У записі class Child(Base) клас Base – базовий, Child – похідний. Якщо базовий клас явно не зазначено, звичайний Python-клас зрештою походить від object. Успадковані методи доступні екземпляру, але їх поведінку можна перевизначити (override). https://docs.python.org/3.14/tutorial/classes.html#inheritance.
py
class Message:
def __init__(self, text: str) -> None:
if not text.strip():
raise ValueError("Порожнє повідомлення")
self.text = text.strip()
def render(self) -> str:
return self.text
class TaggedMessage(Message):
def __init__(self, text: str, tag: str) -> None:
super().__init__(text)
self.tag = tag
def render(self) -> str:
return f"[{self.tag}] {super().render()}"
message = TaggedMessage("Готово", "INFO")
print(message.render())
print(isinstance(message, Message))[INFO] Готово
TrueПохідний __init__ не викликає базовий автоматично, якщо його перевизначено. super().__init__(text) забезпечує базову валідацію й атрибут text. Якщо цього не зробити, об’єкт може створитися без необхідного стану, а помилка з’явиться лише під час пізнішого виклику методу.
super() означає «продовжити пошук після поточного класу в порядку MRO», а не завжди «викликати безпосереднього батька». Для одного базового класу ці уявлення часто збігаються, але при множинному наслідуванні різниця стає принциповою. Прямий виклик Base.method(self) обходить кооперативний порядок.
Перевірки типу
isinstance(obj, Base) враховує підкласи; type(obj) is Base перевіряє точний тип. issubclass(Child, Base) порівнює класи. obj.__class__ показує фактичний клас, Class.__bases__ – безпосередні бази, Class.__mro__ – повний порядок пошуку. Ці засоби корисні для діагностики й перевірки контракту на межі.
Не замінюйте ними поліморфізм усередині кожної операції. Якщо для нового виду фігури потрібно змінювати всі функції звіту, спільний інтерфейс використано недостатньо. Точна перевірка типу доречна лише тоді, коли контракт справді забороняє підкласи, як у прикладі цілих грошових сум із теми 8.
Поліморфізм і качина типізація
Поліморфізм (polymorphism) – можливість працювати через спільний інтерфейс із різними реалізаціями. Колекція фігур може містити коло й прямокутник; кожний виклик area() обирає реалізацію відповідного об’єкта. Спільний інтерфейс визначає також одиниці, допустимі аргументи й зміст результату. Однакової назви методу недостатньо для сумісності поведінки.
Качина типізація (duck typing) акцентує потрібні операції, а не походження класу. Об’єкт із методом render() може бути придатним для звіту без успадкування від спеціального класу. Проте виклик усе одно може завершитися помилкою. Принцип EAFP дозволяє виконати потрібну операцію й обробити очікувану відмову, але не виправдовує перехоплення всіх винятків без аналізу.
Помилка AttributeError може виникнути і всередині реалізації методу, тому надто широкий try здатний приховати дефект як «об’єкт не підтримується». Для навчальних моделей краще встановити інтерфейс через анотацію, перевірити його прикладами та обробляти предметні винятки на межі програми.