Python Поліморфізм
Слово "поліморфізм" означає "багато форм", і в програмуванні воно відноситься до методів/функцій/операторів з однаковою назвою, які можуть бути виконані для багатьох об’єктів або класів.
Поліморфізм функцій
Прикладом функції Python, яку можна використовувати для різних об’єктів, є функція len()
.
String / Рядок
Для рядків len()
повертає кількість символів:
Tuple / Кортеж
Для кортежів len()
повертає кількість елементів у кортежі:
Dictionary / Словник
Для словників len()
повертає кількість пар ключ/значення у словнику:
Приклад
thisdict = {
"brand": "Ford",
"model": "Mustang",
"year": 1964
}
print(len(thisdict))
Спробуйте самі »
Поліморфізм класу
Поліморфізм часто використовується в методах класу, де ми можемо мати кілька класів з однаковою назвою методу.
Наприклад, скажімо, у нас є три класи: Car
, Boat
і Plane
, і всі вони мають метод під назвою move()
:
Приклад
Різні класи з одним методом:
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Drive!")
class Boat:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Sail!")
class Plane:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Fly!")
car1 = Car("Ford", "Mustang") #Створити Car клас
boat1 = Boat("Ibiza", "Touring 20") #Створити Boat клас
plane1 = Plane("Boeing", "747") #Створити Plane клас
for x in (car1, boat1, plane1):
x.move()
Спробуйте самі »
Подивіться на цикл for в кінці. Через поліморфізм ми можемо виконати той самий метод для всіх трьох класів.
Поліморфізм класу успадкування
А як щодо класів з дочірніми класами з однаковою назвою? Чи можемо ми тут використати поліморфізм?
Так. Якщо ми використаємо наведений вище приклад і створимо батьківський клас під назвою Vehicle
, а також Car
, Boat
, Plane
дочірні класи Vehicle
, дочірні класи успадковують методи Vehicle
, але може замінити їх:
Приклад
Створіть клас під назвою Vehicle
і створіть Car
, Boat
, Plane
дочірні класи Vehicle
:
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Move!")
class Car(Vehicle):
pass
class Boat(Vehicle):
def move(self):
print("Sail!")
class Plane(Vehicle):
def move(self):
print("Fly!")
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()
Спробуйте самі »
Дочірні класи успадковують властивості та методи від батьківського класу.
У прикладі вище ви бачите, що клас Car
порожній, але він успадковує brand
, model
і move()
з Vehicle
.
Класи Boat
і Plane
також успадковують brand
, model
та move()
з Vehicle
, але вони обидва замінюють метод move()
.
Через поліморфізм ми можемо виконати той самий метод для всіх класів.