Сегодня вы узнаете что такое полиморфизм, о различных типах полиморфизма и о том, как мы можем реализовать их в Python с помощью реальных примеров.
Введение
Буквальное значение полиморфизма — это условие возникновения различных форм.
Описание полиморфизма на Википедии
Полиморфизм — очень важное понятие в программировании. Это относится к использованию сущности одного типа (метода, оператора или объекта) для представления различных типов в различных сценариях.
Давайте рассмотрим первый пример — полиморфизм в операторе сложения.
Мы знаем, что оператор + широко используется в программах Python. Но у него нет единственного метода использования.
Для целочисленных типов данных оператор + используется для выполнения операции арифметического сложения.
Пример:
a = 2 b = 2 print(a + b)
Вывод программы:
4
Аналогично, для строковых типов данных оператор + используется для выполнения конкатенации:
a = "Программировать" b = "интересно" print(a + " " + b)
Вывод программы:
Программировать интересно
Здесь мы видим, что один и тот же оператор + использовался для выполнения различных операций для отличающихся типов данных.
Эти примеры являются одними из самых простых проявлений полиморфизма в Python.
Полиморфизм функций
В Python есть некоторые функции, которые совместимы для работы с несколькими типами данных.
Одной из таких функций является функция len. Она может работать со многими типами данных в Python.
Давайте рассмотрим несколько примеров использования этой функции:
print(len("Программист")) print(len(["Яблоко", "Банан", "Груша"])) print(len({"Имя": "Максим", "Address": "Москва"}))
Вывод программы:
11 3 2
Здесь мы видим, что многие типы данных, такие как string, list, tuple, set и dictionary, могут работать с функцией len. Однако хочу отметить, что она возвращает конкретную информацию о конкретных типах данных.
Полиморфизм классов
Полиморфизм — очень важное понятие в объектно-ориентированном программировании.
Мы можем использовать концепцию полиморфизма при создании методов классов, поскольку Python позволяет разным классам иметь методы с одинаковыми именами.
Затем мы можем обобщить вызов этих методов, игнорируя объект, с которым мы работаем.
Давайте рассмотрим пример:
class Cat: def __init__(self, klichka, vozrast): self.klichka = klichka self.vozrast = vozrast def status(self): print(f"Я кошка. Меня зовут {self.klichka}. Мой возраст {self.vozrast} лет") def say(self): print("Мяу") class Dog: def __init__(self, klichka, vozrast): self.klichka = klichka self.vozrast = vozrast def status(self): print(f"Я собака. Меня зовут {self.klichka}. Мой возраст {self.vozrast} лет") def say(self): print("Гав") cat_obj = Cat("Муська", 10) dog_obj = Dog("Барон", 12) for pet in (cat_obj, dog_obj): pet.say() pet.status() pet.say()
Вывод программы:
Мяу Я кошка. Меня зовут Муська. Мой возраст 10 лет Мяу Гав Я собака. Меня зовут Барон. Мой возраст 12 лет Гав
Здесь мы создали два класса: Cat и Dog. Они имеют схожую структуру и одинаковые имена методов status и say.
Обратите внимание, что я не создал общий суперкласс и не связал классы каким-либо образом. Даже теперь я могу упаковать эти два разных объекта в кортеж и перебирать его, используя общую переменную animal.
Это возможно благодаря полиморфизму!
Полиморфизм и наследование
Как и в других языках программирования, дочерние классы в Python также наследуют методы и атрибуты от родительского класса. Мы можем переопределить некоторые методы и атрибуты специально для того, чтобы они соответствовали дочернему классу, который известен как «Переопределение методов» (Method Overriding).
Полиморфизм позволяет мне получить доступ к этим переопределенным методам и атрибутам, которые имеют то же имя, что и родительский класс.
Давайте рассмотрим пример:
from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def info(self): return "Я двухмерная форма." def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Квадрат") self.length = length def area(self): return self.length ** 2 def info(self): return "Квадраты имеют каждый угол равный 90 градусам." class Circle(Shape): def __init__(self, radius): super().__init__("Круг") self.radius = radius def area(self): return pi * self.radius ** 2 kvadrat = Square(8) krug = Circle(14) print(kvadrat) print(kvadrat.info()) print(krug.info()) print(kvadrat.area())
Вывод программы:
Квадрат Квадраты имеют каждый угол равный 90 градусам. Я двухмерная форма. 64
Здесь мы видим, что такие методы, как str, которые не были переопределены в дочерних классах, используются из родительского класса.
Из-за полиморфизма интерпретатор Python автоматически распознает, что метод info для объекта kvadrat (класс Square) переопределен. Таким образом, он использует тот, который определен в дочернем классе.
С другой стороны, поскольку метод info для объекта krug не переопределяется, он используется из родительского класса Shape.
Примечание: Method Overriding, способ создания нескольких методов с одинаковым именем, но разными аргументами, невозможен в Python.
Заключение
На этом урок по полиморфизму в Python окончен, надеюсь, что всё было понятно.
Удачи в программировании!