In questo tutorial impareremo il polimorfismo, i diversi tipi di polimorfismo e come possiamo implementarli in Python con l'aiuto di esempi.
Cos'è il polimorfismo?
Il significato letterale del polimorfismo è la condizione del verificarsi in diverse forme.
Il polimorfismo è un concetto molto importante nella programmazione. Si riferisce all'uso di una singola entità di tipo (metodo, operatore o oggetto) per rappresentare diversi tipi in diversi scenari.
Facciamo un esempio:
Esempio 1: polimorfismo in aggiunta all'operatore
Sappiamo che l' +
operatore è ampiamente utilizzato nei programmi Python. Ma non ha un singolo utilizzo.
Per i tipi di dati interi, l' +
operatore viene utilizzato per eseguire l'operazione di addizione aritmetica.
num1 = 1 num2 = 2 print(num1+num2)
Quindi, il programma di cui sopra produce 3.
Allo stesso modo, per i tipi di dati stringa, l' +
operatore viene utilizzato per eseguire la concatenazione.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
Di conseguenza, il programma precedente genera la programmazione Python.
Qui possiamo vedere che un singolo operatore +
è stato utilizzato per eseguire diverse operazioni per diversi tipi di dati. Questa è una delle occorrenze più semplici di polimorfismo in Python.
Polimorfismo delle funzioni in Python
Ci sono alcune funzioni in Python che sono compatibili per essere eseguite con più tipi di dati.
Una di queste funzioni è la len()
funzione. Può funzionare con molti tipi di dati in Python. Diamo un'occhiata ad alcuni casi d'uso di esempio della funzione.
Esempio 2: funzione polimorfica len ()
print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal")))
Produzione
9 3 2
Qui, possiamo vedere che molti tipi di dati come string, list, tuple, set e dictionary possono funzionare con la len()
funzione. Tuttavia, possiamo vedere che restituisce informazioni specifiche su tipi di dati specifici.

Polimorfismo di classe in Python
Il polimorfismo è un concetto molto importante nella programmazione orientata agli oggetti.
Per ulteriori informazioni su OOP in Python, visitare: Python Object-Oriented Programming
Possiamo usare il concetto di polimorfismo durante la creazione di metodi di classe poiché Python consente a classi diverse di avere metodi con lo stesso nome.
Successivamente possiamo generalizzare la chiamata a questi metodi ignorando l'oggetto con cui stiamo lavorando. Diamo un'occhiata a un esempio:
Esempio 3: polimorfismo nei metodi di classe
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()
Produzione
Miao sono un gatto. Il mio nome è Kitty. Ho 2,5 anni. Meow Bark Sono un cane. Il mio nome è Fluffy. Ho 4 anni. Abbaiare
Qui abbiamo creato due classi Cat
e Dog
. Condividono una struttura simile e hanno gli stessi nomi di metodo info()
e make_sound()
.
Tuttavia, nota che non abbiamo creato una superclasse comune o collegato le classi in alcun modo. Anche allora, possiamo impacchettare questi due diversi oggetti in una tupla e iterare attraverso di essa usando una variabile animale comune. È possibile a causa del polimorfismo.
Polimorfismo ed ereditarietà
Come in altri linguaggi di programmazione, anche le classi figlie in Python ereditano metodi e attributi dalla classe genitore. Possiamo ridefinire alcuni metodi e attributi specificatamente per adattarli alla classe figlia, nota come Method Overriding .
Il polimorfismo ci consente di accedere a questi metodi e attributi sovrascritti che hanno lo stesso nome della classe genitore.
Diamo un'occhiata a un esempio:
Esempio 4: sostituzione del metodo
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())
Produzione
Cerchio Sono una forma bidimensionale. I quadrati hanno ogni angolo uguale a 90 gradi. 153.93804002589985
Qui, possiamo vedere che i metodi come __str__()
, che non sono stati sovrascritti nelle classi figlie, vengono usati dalla classe genitore.
A causa del polimorfismo, l'interprete Python riconosce automaticamente che il fact()
metodo per object a
(classe Square) è sovrascritto. Quindi, usa quello definito nella classe figlia.
D'altra parte, poiché il fact()
metodo per l'oggetto b non è sovrascritto, viene utilizzato dalla classe Parent Shape.

Nota : il sovraccarico del metodo , un modo per creare più metodi con lo stesso nome ma argomenti diversi, non è possibile in Python.