Полиморфизм в Python

Что такое полиморфизм?

Полиморфизм — это концепция в программировании, происходящая от греческих слов "poly" (много) и "morphism" (форма), что означает "множество форм". Полиморфизм позволяет использовать одну и ту же сущность (операцию, функцию, метод, объект) для разных типов данных, что делает код более универсальным и интуитивно понятным.

Полиморфизм через операции

В Python полиморфизм можно увидеть в операциях, где один и тот же оператор может выполнять разные действия в зависимости от типов операндов.


 

Пример: Оператор сложения

Оператор + демонстрирует полиморфизм:

# Сложение целых чисел
num1 = 3
num2 = 4
print(num1 + num2)  # Вывод: 7

# Конкатенация строк
str1 = "Hello, "
str2 = "World!"
print(str1 + str2)  # Вывод: Hello, World!

# Сложение списков
list1 = [1, 2]
list2 = [3, 4]
print(list1 + list2)  # Вывод: [1, 2, 3, 4]


Полиморфные функции

Некоторые функции в Python могут принимать аргументы различных типов. Это позволяет им работать с разными данными, предоставляя при этом специфический результат.


Пример: Функция len()

Функция len() может принимать различные типы данных:

print(len("Hello"))               # Вывод: 5 (строка)
print(len([1, 2, 3, 4, 5]))       # Вывод: 5 (список)
print(len({"a": 1, "b": 2}))      # Вывод: 2 (словарь)
print(len((1, 2, 3)))              # Вывод: 3 (кортеж)


Полиморфизм в методах классов

Полиморфизм также можно наблюдать в методах классов, где различные классы могут иметь методы с одинаковыми именами, но с разной реализацией.


Пример: Классы Cat и Dog

Рассмотрим два класса, Cat и Dog, которые имеют методы с одинаковыми именами:

class Cat:
    def __init__(self, name):
        self.name = name

    def info(self):
        print(f"I am a cat named {self.name}.")

    def make_sound(self):
        print("Meow")

class Dog:
    def __init__(self, name):
        self.name = name

    def info(self):
        print(f"I am a dog named {self.name}.")

    def make_sound(self):
        print("Bark")

# Создаем экземпляры классов
cat_obj = Cat("Whiskers")
dog_obj = Dog("Rover")

# Обработка объектов разных типов
for animal in (cat_obj, dog_obj):
    animal.make_sound()  # Вывод: Meow, Bark
    animal.info()        # Вывод: I am a cat named Whiskers. / I am a dog named Rover.


Утиная типизация

В языках программирования с динамической типизацией, таких как Python, переменные могут принимать значения разных типов, и для работы с объектами одного типа нет строгих требований.


Концепция утиной типизации

"Если что-то выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка." Это выражение иллюстрирует идею, что для работы с объектами важнее их поведение, чем их точный тип.


Пример: Утиная типизация

Рассмотрим класс Duck и класс RoboticBird, которые имеют похожие методы:

class Duck:
    def swim(self):
        print("Duck swims.")

    def quack(self):
        print("Duck quacks.")

class RoboticBird:
    def swim(self):
        print("Robotic bird swims.")

    def quack(self):
        print("Robotic bird mimics a quack.")

def duck_testing(duck):
    duck.swim()
    duck.quack()

# Создаем экземпляры
duck = Duck()
robotic_bird = RoboticBird()

# Проверяем утиную типизацию
duck_testing(duck)             # Вывод: Duck swims. Duck quacks.
duck_testing(robotic_bird)     # Вывод: Robotic bird swims. Robotic bird mimics a quack.

Вот таблица по лекции о полиморфизме через операции:

ТемаОписание
Полиморфизм через операторыОдин и тот же оператор выполняет разные действия в зависимости от типов операндов.
Оператор сложения (+)- Сложение чисел: 3 + 4 = 7
- Конкатенация строк: "Hello" + "World" = "Hello, World!"
- Сложение списков: [1, 2] + [3, 4] = [1, 2, 3, 4]
Полиморфные функцииНекоторые функции могут работать с разными типами данных, предоставляя специфический результат для каждого типа.
Функция len()Возвращает длину объектов разных типов:
- Строка: len("Hello") = 5
- Список: len([1, 2, 3]) = 3
- Словарь: len({"a": 1}) = 1
Полиморфизм в методах классовРазные классы могут иметь методы с одинаковыми именами, но с разной реализацией.
Пример с классами Cat и DogОба класса имеют методы info() и make_sound(), но они выполняют разные действия для каждого объекта класса.
Утиная типизацияВажнее поведение объекта, чем его точный тип. Если объект выглядит и ведёт себя как ожидается, то его тип не имеет значения.
Концепция утиной типизации"Если что-то выглядит как утка и ведёт себя как утка, то это утка".
Пример с классами Duck и RoboticBirdОба класса имеют методы swim() и quack(), которые вызываются одинаково, несмотря на разные типы объектов.

Таблица отражает основные аспекты полиморфизма и утиной типизации в Python.


Полиморфизм — это мощный инструмент, позволяющий делать код более гибким и удобным. Он позволяет использовать одни и те же операции и методы с разными типами данных, что улучшает читабельность и поддержку кода. Утиная типизация дополняет эту концепцию, позволяя разработчикам сосредоточиться на поведении объектов, а не на их типах.

Перейти к следующему шагу

Комментарии