Сегодня вы узнаете что такое полиморфизм, о различных типах полиморфизма и о том, как мы можем реализовать их в 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 окончен, надеюсь, что всё было понятно.
Больше статей о языке программирования Python можно найти по этой ссылке.
Удачи в программировании!
Если вы ищите способ системно подойти к обучению языка программирования Python, рекомендую записаться на курсы онлайн обучения.
Поделиться записью в социальных сетях