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

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

Буквальное значение полиморфизма — это состояние появления в разных формах.

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

Рассмотрим пример:

Пример 1: Полиморфизм в операторе сложения

Мы знаем, что оператор + широко используется в программах Python. Но он не имеет единственного применения.

Для целочисленных типов данных оператор + используется для выполнения арифметической операции сложения.

num1 = 1
num2 = 2
print(num1+num2)

Следовательно, приведённая выше программа выводит 3.


Аналогично, для строковых типов данных оператор + используется для конкатенации.

str1 = "Python"
str2 = "Programming"
print(str1+" "+str2)

В результате приведённая выше программа выводит Python Programming.

Здесь мы видим, что один оператор + использовался для выполнения разных операций для разных типов данных. Это одно из самых простых проявлений полиморфизма в Python.


Полиморфизм функций в Python

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

Одна из таких функций — len(). Она может работать со многими типами данных в Python. Рассмотрим некоторые примеры использования этой функции.

Пример 2: Полиморфная функция len()

print(len("Programiz"))
print(len(["Python", "Java", "C"]))
print(len({"Name": "John", "Address": "Nepal"}))

Вывод

9
3
2

Здесь мы видим, что многие типы данных, такие как строка, список, кортеж, множество и словарь, могут работать с функцией len(). Однако мы видим, что она возвращает специфичную информацию о конкретных типах данных.

Полиморфизм функции len() в Python

Полиморфизм классов в Python

Полиморфизм — очень важная концепция в объектно-ориентированном программировании.

Чтобы узнать больше об ООП в Python, посетите: Объектно-ориентированное программирование в Python

Мы можем использовать концепцию полиморфизма при создании методов класса, поскольку Python позволяет разным классам иметь методы с одинаковыми именами.

Затем мы можем обобщить вызов этих методов, игнорируя объект, с которым мы работаем. Рассмотрим пример:

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

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

    def info(self):
        print(f"I am a cat. My name is {self.name}. I am {self.age} years old.")

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

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

    def info(self):
        print(f"I am a dog. My name is {self.name}. I am {self.age} years old.")

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

cat1 = Cat("Kitty", 2.5)
dog1 = Dog("Fluffy", 4)

for animal in (cat1, dog1):
    animal.make_sound()
    animal.info()
    animal.make_sound()

Вывод

Meow
I am a cat. My name is Kitty. I am 2.5 years old.
Meow
Bark
I am a dog. My name is Fluffy. I am 4 years old.
Bark

Здесь мы создали два класса Cat и Dog. Они имеют похожую структуру и одинаковые имена методов info() и make_sound().

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


Полиморфизм и наследование

Как и в других языках программирования, дочерние классы в Python также наследуют методы и атрибуты от родительского класса. Мы можем переопределить определённые методы и атрибуты специально, чтобы они подходили дочернему классу, что известно как переопределение методов.

Полиморфизм позволяет нам получить доступ к этим переопределённым методам и атрибутам, имеющим то же имя, что и в родительском классе.

Рассмотрим пример:

Пример 4: Переопределение методов

from math import pi

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

    def area(self):
        pass

    def fact(self):
        return "I am a two-dimensional shape."

    def __str__(self):
        return self.name

class Square(Shape):
    def __init__(self, length):
        super().__init__("Square")
        self.length = length

    def area(self):
        return self.length**2

    def fact(self):
        return "Squares have each angle equal to 90 degrees."

class Circle(Shape):
    def __init__(self, radius):
        super().__init__("Circle")
        self.radius = radius

    def area(self):
        return pi*self.radius**2

a = Square(4)
b = Circle(7)
print(b)
print(b.fact())
print(a.fact())
print(b.area())

Вывод

Circle
I am a two-dimensional shape.
Squares have each angle equal to 90 degrees.
153.93804002589985

Здесь мы видим, что методы, такие как __str__(), которые не были переопределены в дочерних классах, используются из родительского класса.

Благодаря полиморфизму, интерпретатор Python автоматически распознаёт, что метод fact() для объекта a (класс Square) переопределён. Поэтому он использует тот, который определён в дочернем классе.

С другой стороны, поскольку метод fact() для объекта b не переопределён, он используется из родительского класса Shape.

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

Примечание

Перегрузка методов — способ создания нескольких методов с одинаковым именем, но разными аргументами — невозможна в Python.

Смотрите также: