Polymorphism
Определение#
Полиморфизм (Polymorphism) — это принцип ООП, позволяющий разным классам по‑разному реагировать на один и тот же вызов метода. В Python это часто реализуется через Duck Typing: «если оно крякает как утка, то это утка». Дословно: «многообразие форм».
Для чего?#
Полиморфизм позволяет писать универсальный код, который может работать с любыми объектами, если они поддерживают нужные методы.
- Гибкость — можно добавлять новые классы, не меняя основной код программы.
- Упрощение — вместо множества проверок
if type == ..., мы просто вызываем метод.
Разница Полиморфизма и Наследования#
- Полиморфизм позволяет вызывать одинаковые методы у объектов разных типов, и каждый из них выполняет эти вызовы по‑своему.
- Наследование позволяет унаследовать общий набор методов от родительского класса и расширять/переопределять его в потомках.
Главная идея Полиморфизма: один интерфейс — много реализаций.
Главная идея Наследования: общее поведение от родительского класса и расширение/переопределение его в дочерних классах.
Виды полиморфизма в Python#
В Python полиморфизм проявляется через несколько механизмов:
- Overriding (переопределение методов) — когда дочерний класс меняет поведение родительского метода.
- Duck Typing («утиная типизация») — если объект «ходит как утка и крякает как утка», то Python считает его уткой. Нам не важно наследование, нам важно наличие метода.
| Понятие | Суть | Пример в Python |
|---|---|---|
| Overriding | Подмена метода родителя своим | def turn_on(self): ... |
| Duck Typing | Тип объекта не важен, важен метод | func(obj): obj.draw() |
Пример#
class Bird:
def speak(self):
pass
class Duck(Bird):
def speak(self):
return "Кря-кря!"
class Cat: # Не наследует Bird, но имеет метод speak
def speak(self):
return "Мяу!"
def make_it_speak(animal):
# Универсальный код: работает с любым объектом, у которого есть speak()
print(animal.speak())
# Полиморфизм через наследование
duck = Duck()
# Полиморфизм через Duck Typing
cat = Cat()
make_it_speak(duck) # Кря-кря!
make_it_speak(cat) # Мяу!
Ключевые мысли#
- Полиморфизм делает код расширяемым: новые классы интегрируются в систему без переписывания старых функций.
- Благодаря «утиной типизации» Python фокусируется на поведении объекта, а не на его принадлежности к классу.
- Правильное использование полиморфизма убирает излишние проверки типов и делает архитектуру приложения «чище».