Поліморфізм у Python: Пояснення та приклади

Автор Pekfo, Квт. 08, 2025, 02:46 PM

« попередня та - наступна тема »

Pekfo

Поліморфізм — це одна з ключових концепцій об'єктно-орієнтованого програмування (ООП), яка дозволяє об'єктам різних класів оброблятися однаково, якщо вони мають спільний інтерфейс або базовий клас. У Python поліморфізм реалізується природно завдяки динамічній типізації та підтримці спадкування. У цьому матеріалі ми розглянемо, що таке поліморфізм, як він працює в Python, і надамо кілька оригінальних прикладів коду.

Що таке поліморфізм?
Слово "поліморфізм" походить від грецьких слів "poly" (багато) і "morph" (форма), тобто "багато форм". У контексті програмування це означає, що один і той самий метод або функція може працювати з різними типами об'єктів, якщо ці об'єкти реалізують однакову поведінку. У Python поліморфізм часто досягається через:

  • Спадкування (коли класи успадковують методи базового класу).
  • Інтерфейси або абстрактні методи (хоча в Python немає строгих інтерфейсів, це імітується через абстрактні базові класи).
  • "Качин типізацію" (duck typing), коли об'єкт вважається придатним, якщо він має потрібні методи, незалежно від його типу.

Приклад 1: Поліморфізм через спадкування
Розглянемо ситуацію, коли ми моделюємо транспортні засоби. У нас є базовий клас Транспорт і два похідні класи: Автомобіль і Велосипед. Кожен з них має свій спосіб "пересування", але ми можемо викликати їх однаково.
class Транспорт:
    def пересуватися():
        raise NotImplementedError("Цей метод має бути перевизначений у похідному класі")

class Автомобіль(Транспорт):
    def пересуватися(self):
        return "Автомобіль їде по дорозі зі звуком 'Врум-врум!'"

class Велосипед(Транспорт):
    def пересуватися(self):
        return "Велосипед крутить педалі зі звуком 'Шур-шур!'"

# Функція, яка демонструє поліморфізм
def рух(транспортний_засіб):
    print(транспортний_засіб.пересуватися())

# Створюємо об'єкти
авто = Автомобіль()
велосипед = Велосипед()

# Викликаємо функцію з різними об'єктами
рух(авто)      # Виведе: Автомобіль їде по дорозі зі звуком 'Врум-врум!'
рух(велосипед) # Виведе: Велосипед крутить педалі зі звуком 'Шур-шур!'

Пояснення:
Функція рух приймає будь-який об'єкт, який має метод пересуватися. Завдяки поліморфізму ми можемо передавати об'єкти різних класів, і код працюватиме коректно.

Приклад 2: Поліморфізм через "качину типізацію"
У Python не завжди потрібне явне спадкування. Якщо об'єкт має потрібний метод, він може бути використаний — це називається "качиною типізацією" ("Якщо це виглядає як качка і крякає як качка, то це качка").
class Пес:
    def голос(self):
        return "Гав-гав!"

class Кіт:
    def голос(self):
        return "Мяу-мяу!"

class Робот:
    def голос(self):
        return "Біп-буп!"

# Функція, яка працює з будь-яким об'єктом, що має метод "голос"
def почути_звук(тварина):
    print(тварина.голос())

# Створюємо об'єкти
пес = Пес()
кіт = Кіт()
робот = Робот()

# Викликаємо функцію
почути_звук(пес)    # Виведе: Гав-гав!
почути_звук(кіт)    # Виведе: Мяу-мяу!
почути_звук(робот)  # Виведе: Біп-буп!

Пояснення:
Тут класи Пес, Кіт і Робот не пов'язані між собою спадкуванням, але функція почути_звук працює з усіма трьома, бо кожен об'єкт має метод голос.

Приклад 3: Поліморфізм із вбудованими функціями
Python також підтримує поліморфізм у своїх вбудованих функціях. Наприклад, функція len() працює з різними типами об'єктів, які реалізують метод __len__.
class КнижковаПолиця:
    def __init__(self, книги):
        self.книги = книги
   
    def __len__(self):
        return len(self.книги)

class КоробкаЗІграми:
    def __init__(self, ігри):
        self.ігри = ігри
   
    def __len__(self):
        return len(self.ігри)

# Створюємо об'єкти
полиця = КнижковаПолиця(["Роман", "Детектив", "Фентезі"])
коробка = КоробкаЗІграми(["Шахи", "Монополія"])

# Використовуємо вбудовану функцію len()
print(len(полиця))  # Виведе: 3
print(len(коробка)) # Виведе: 2

Пояснення:
Функція len() працює з будь-яким об'єктом, який має метод __len__. Це приклад поліморфізму, вбудованого в мову програмування.

Переваги поліморфізму
  • Гнучкість: Код стає універсальним і може працювати з різними типами об'єктів.
  • Повторне використання: Одну функцію можна використовувати для різних класів.
  • Зручність підтримки: Додавання нового класу не потребує зміни існуючого коду, якщо він відповідає інтерфейсу.

Висновок
Поліморфізм у Python — це потужний інструмент, який робить код більш абстрактним і зручним для розширення. Завдяки спадкуванню, "качиній типізації" та підтримці вбудованих методів, Python дозволяє легко реалізовувати цю концепцію. Спробуйте створити власні приклади, наприклад, моделюючи працівників компанії чи музичні інструменти, щоб краще зрозуміти, як працює поліморфізм на практиці!