Skip to content

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 фокусируется на поведении объекта, а не на его принадлежности к классу.
  • Правильное использование полиморфизма убирает излишние проверки типов и делает архитектуру приложения «чище».

Теги#