Полиморфизм в 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(). Однако мы видим, что она возвращает специфичную информацию о конкретных типах данных.
Полиморфизм классов в 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.
Смотрите также: