Буквально слово «полиморфизм» означает «много форм». В программировании этот термин описывает методы, функции или операторы с одним и тем же именем, которые могут работать со многими разными объектами или классами.
Полиморфизм функций
Хороший пример в Python — встроенная функция len(), потому что она работает с объектами разных типов.
Пример
Для строки len() считает символы:
Вывод: полная программа на Python
x = "Hello World!"
print(len(x))
Пример
Для кортежа len() считает элементы:
Вывод: полная программа на Python
mytuple = ("apple", "banana", "cherry")
print(len(mytuple))
Пример
Для словаря len() считает пары «ключ/значение»:
Вывод: полная программа на Python
thisdict = {
"brand": "Ford",
"model": "Mustang",
"year": 1964
}
print(len(thisdict))
Полиморфизм классов
Полиморфизм часто встречается в методах классов: несколько классов могут определять метод с одним и тем же именем.
Допустим, у каждого из классов Car, Boat и Plane есть собственный метод move():
Обратите внимание на цикл for в конце кода. Именно полиморфизм позволяет ему выполнить один и тот же метод для объектов всех трёх классов.
Пример
Три класса с одинаковым именем метода:
Вывод: полная программа на Python
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Еду!")
class Boat:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Плыву!")
class Plane:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Лечу!")
car1 = Car("Ford", "Mustang") #Создаём объект Car
boat1 = Boat("Ibiza", "Touring 20") #Создаём объект Boat
plane1 = Plane("Boeing", "747") #Создаём объект Plane
for x in (car1, boat1, plane1):
x.move()
Полиморфизм классов при наследовании
Работает ли это с дочерними классами, у которых методы с одинаковым именем? Да.
Возьмите классы выше и добавьте родительский класс Vehicle, а Car, Boat и Plane сделайте его дочерними классами. Каждый дочерний класс получает методы Vehicle и может их переопределять:
Дочерний класс наследует свойства и методы своего родителя.
Посмотрите на Car в примере: тело этого класса пустое, но он всё равно получает brand, model и move() от Vehicle.
Boat и Plane тоже получают эти три члена от Vehicle, но каждый из них заменяет move() собственным переопределением.
Благодаря полиморфизму один и тот же вызов метода работает для всех этих классов.
Пример
Добавьте родительский класс с именем Vehicle и сделайте Car, Boat и Plane его дочерними классами:
Вывод: полная программа на Python
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Двигаюсь!")
class Car(Vehicle):
pass
class Boat(Vehicle):
def move(self):
print("Плыву!")
class Plane(Vehicle):
def move(self):
print("Лечу!")
car1 = Car("Ford", "Mustang") #Создаём объект Car
boat1 = Boat("Ibiza", "Touring 20") #Создаём объект Boat
plane1 = Plane("Boeing", "747") #Создаём объект Plane
for x in (car1, boat1, plane1):
print(x.brand)
print(x.model)
x.move()