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

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

Сегодня вы узнаете что такое полиморфизм, о различных типах полиморфизма и о том, как мы можем реализовать их в 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 с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий