Literal, „polimorfism” înseamnă „multe forme”. În programare, termenul descrie metode, funcții sau operatori care au același nume, dar pot rula pe multe obiecte sau clase diferite.
Polimorfismul funcțiilor
Funcția încorporată len() este un bun exemplu în Python, deoarece funcționează pe obiecte de tipuri diferite.
Exemplu
Pentru un șir, len() numără caracterele:
Ieșire: program Python complet
x = "Hello World!"
print(len(x))
Exemplu
Pentru un tuplu, len() numără elementele:
Ieșire: program Python complet
mytuple = ("apple", "banana", "cherry")
print(len(mytuple))
Exemplu
Pentru un dicționar, len() numără perechile cheie/valoare:
Ieșire: program Python complet
thisdict = {
"brand": "Ford",
"model": "Mustang",
"year": 1964
}
print(len(thisdict))
Polimorfismul claselor
Metodele claselor sunt un loc frecvent pentru polimorfism: mai multe clase pot defini fiecare o metodă cu același nume.
Să presupunem că fiecare dintre clasele Car, Boat și Plane are propria metodă move():
Observă bucla for de la sfârșitul codului. Polimorfismul este cel care îi permite să execute aceeași metodă pe obiecte din toate cele trei clase.
Exemplu
Trei clase care au același nume de metodă:
Ieșire: program Python complet
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Conduce!")
class Boat:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Navighează!")
class Plane:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Zboară!")
car1 = Car("Ford", "Mustang") #Creează un obiect Car
boat1 = Boat("Ibiza", "Touring 20") #Creează un obiect Boat
plane1 = Plane("Boeing", "747") #Creează un obiect Plane
for x in (car1, boat1, plane1):
x.move()
Polimorfismul claselor prin moștenire
Funcționează asta și cu clase copil care au același nume de metodă? Da.
Ia clasele de mai sus și adaugă o clasă părinte, Vehicle, cu Car, Boat și Plane drept clase copil. Fiecare clasă copil primește metodele din Vehicle și le poate suprascrie:
O clasă copil preia proprietățile și metodele părintelui ei.
Uită-te la Car din exemplu: are corpul gol, dar primește totuși brand, model și move() de la Vehicle.
Și Boat și Plane primesc aceiași trei membri de la Vehicle, dar fiecare înlocuiește move() cu propria suprascriere.
Datorită polimorfismului, un singur apel de metodă funcționează pentru toate aceste clase.
Exemplu
Adaugă o clasă părinte numită Vehicle și derivă din ea Car, Boat și Plane:
Ieșire: program Python complet
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def move(self):
print("Se mișcă!")
class Car(Vehicle):
pass
class Boat(Vehicle):
def move(self):
print("Navighează!")
class Plane(Vehicle):
def move(self):
print("Zboară!")
car1 = Car("Ford", "Mustang") #Creează un obiect Car
boat1 = Boat("Ibiza", "Touring 20") #Creează un obiect Boat
plane1 = Plane("Boeing", "747") #Creează un obiect Plane
for x in (car1, boat1, plane1):
print(x.brand)
print(x.model)
x.move()