Ο πολυμορφισμός (Polymorphism) είναι ένα σημαντικό χαρακτηριστικό της αντικειμενοστραφούς προγραμματισμού στην Python που επιτρέπει στις κλάσεις να έχουν μεθόδους με το ίδιο όνομα αλλά με διαφορετική υλοποίηση. Αυτό σημαίνει ότι μπορείτε να ορίσετε μια μέθοδο με το ίδιο όνομα σε διάφορες κλάσεις και ο κατάλληλος κώδικας θα εκτελεστεί ανάλογα με τον τύπο του αντικειμένου που καλεί τη μέθοδο.
Ο πολυμορφισμός επιτρέπει τη χρήση μιάς ενιαίας διεπαφής (interface) για αντικείμενα διαφορετικών τύπων δεδομένων. Αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε την ίδια μέθοδο ή συνάρτηση για αντικείμενα που ανήκουν σε διάφορες κλάσεις, αρκεί να υλοποιήσετε την αντίστοιχη μέθοδο σε κάθε κλάση. Κατά την εκτέλεση του προγράμματος, η σωστή υλοποίηση της μεθόδου θα επιλεγεί αυτόματα ανάλογα με τον τύπο του αντικειμένου.
Η χρήση του πολυμορφισμού μας επιτρέπει να γράφουμε πιο ευέλικτο και ανακλαστικό κώδικα, καθώς μπορούμε να αντιμετωπίσουμε διαφορετικούς τύπους αντικειμένων με τον ίδιο τρόπο χρησιμοποιώντας το κοινό διεπαφής.
Ο πολυμορφισμός στην Python μπορεί να υλοποιηθεί με διάφορους τρόπους, παραδείγματα είναι:
- Μέσω της κληρονομικότητας και της υπερκάλυψης μεθόδων (Method Overriding): Μια υποκλάση μπορεί να ορίσει μια μέθοδο με το ίδιο όνομα με μια μέθοδο στην γονική κλάση, αλλά με διαφορετική υλοποίηση. Κατά την κλήση της μεθόδου, η σωστή υλοποίηση θα επιλεγεί ανάλογα με τον τύπο του αντικειμένου.
- Χρησιμοποιώντας την πολυμορφία των συναρτήσεων (Duck Typing): Στην Python, η πολυμορφία επιτυγχάνεται μέσω του “Duck Typing”, όπου η σωστή υλοποίηση μιας συνάρτησης εξαρτάται από τον τύπο των αντικειμένων που περνούν σαν παράμετροι. Αν ένα αντικείμενο έχει τις απαραίτητες μεθόδους που χρειάζονται από μια συνάρτηση, τότε μπορεί να χρησιμοποιηθεί με ασφάλεια στο πλαίσιο αυτής της συνάρτησης, ανεξαρτήτως του τύπου του.
Αυτοί οι τρόποι επιτρέπουν την ευελιξία και την ανακλαστικότητα στον κώδικά μας, καθώς μας επιτρέπουν να εργαστούμε με διαφορετικούς τύπους αντικειμένων χρησιμοποιώντας ένα κοινό interface ή να προσαρμόζουμε τη συμπεριφορά των αντικειμένων ανάλογα με τον τύπο τους.
Παράδειγμα 1: Υπερκάλυψης Μεθόδων (Method Overriding)
class Animal: def speak(self): pass # Κενή μέθοδος που ορίζεται στην κλάση για υποκλάσεις να την υπερκαλύπτουν class Dog(Animal): def speak(self): return "Woof!" # Υπερκάλυψη της μεθόδου speak() για την επιστροφή του ήχου του σκύλου class Cat(Animal): def speak(self): return "Meow!" # Υπερκάλυψη της μεθόδου speak() για την επιστροφή του ήχου της γάτας # Πολυμορφία μέσω της κληρονομικότητας και της υπερκάλυψης μεθόδων def make_sound(animal): print(animal.speak()) # Κλήση της μεθόδου speak() του αντικειμένου animal dog = Dog() # Δημιουργία αντικειμένου τύπου Dog cat = Cat() # Δημιουργία αντικειμένου τύπου Cat make_sound(dog) # Εκτύπωση του ήχου του σκύλου ("Woof!") make_sound(cat) # Εκτύπωση του ήχου της γάτας ("Meow!")
Ο παραπάνω κώδικας ορίζει τρεις κλάσεις: Animal
, Dog
και Cat
. Η κλάση Animal
είναι η βασική κλάση και περιέχει μια μέθοδο speak()
που δεν πραγματοποιεί καμία ενέργεια.
Οι κλάσεις Dog
και Cat
κληρονομούν από την κλάση Animal
και υπερκαλύπτουν τη μέθοδο speak()
. Η μέθοδος speak()
της κλάσης Dog
επιστρέφει τον ήχο “Woof!” ενώ η μέθοδος speak()
της κλάσης Cat
επιστρέφει τον ήχο “Meow!”.
Η συνάρτηση make_sound(animal)
δέχεται ένα αντικείμενο animal
και καλεί τη μέθοδο speak()
του αντικειμένου για να εκτυπώσει τον αντίστοιχο ήχο.
Στον κύριο κώδικα, δημιουργούνται ένα αντικείμενο τύπου Dog
με την εντολή dog = Dog()
και ένα αντικείμενο τύπου Cat
με την εντολή cat = Cat()
. Στη συνέχεια, καλείται η συνάρτηση make_sound()
δύο φορές, μία με το αντικείμενο dog
και μία με το αντικείμενο cat
. Οι κλήσεις εκτυπώνουν τον αντίστοιχο ήχο του σκύλου (“Woof!”) και της γάτας (“Meow!”).
[adinserter block=”2″]
Παράδειγμα 2: Duck Typing (Πολυμορφία Συναρτήσεων)
class Dog: def speak(self): return "Woof!" # Επιστροφή του κειμένου "Woof!" ως ήχος που κάνει ο σκύλος class Cat: def speak(self): return "Meow!" # Επιστροφή του κειμένου "Meow!" ως ήχος που κάνει η γάτα def make_sound(animal): print(animal.speak()) # Εκτύπωση του ήχου που παράγει το ζώο dog = Dog() # Δημιουργία αντικειμένου κλάσης Dog με την μεταβλητή dog cat = Cat() # Δημιουργία αντικειμένου κλάσης Cat με την μεταβλητή cat make_sound(dog) # Κλήση της συνάρτησης make_sound με το αντικείμενο dog, εκτυπώνει "Woof!" make_sound(cat) # Κλήση της συνάρτησης make_sound με το αντικείμενο cat, εκτυπώνει "Meow!"
Ο παραπάνω κώδικας ορίζει δύο κλάσεις, την κλάση Dog
και την κλάση Cat
, που έχουν μια μέθοδο με όνομα speak
. Η μέθοδος speak
επιστρέφει αντίστοιχα το κείμενο “Woof!” για την κλάση Dog
και το κείμενο “Meow!” για την κλάση Cat
.
Υπάρχει επίσης η συνάρτηση make_sound
, η οποία παίρνει ένα αντικείμενο animal
ως όρισμα. Αυτή η συνάρτηση καλεί τη μέθοδο speak
του αντικειμένου animal
και εκτυπώνει τον ήχο που επιστρέφεται.
Στη συνέχεια, δημιουργούνται δύο αντικείμενα, ένα από την κλάση Dog
με τη μεταβλητή dog
και ένα από την κλάση Cat
με τη μεταβλητή cat
. Τέλος, η συνάρτηση make_sound
καλείται δύο φορές, μία με το αντικείμενο dog
και μία με το αντικείμενο cat
, και εκτυπώνει τον αντίστοιχο ήχο που κάνει κάθε ζώο. Στην προκειμένη περίπτωση, η έξοδος θα είναι “Woof!” και “Meow!”.
Η πολυμορφία των συναρτήσεων αναφέρεται στην ικανότητα μιας συνάρτησης να λειτουργεί με διαφορετικούς τύπους δεδομένων. Σε γλώσσες προγραμματισμού όπως η Python, υπάρχουν πολλά παραδείγματα πολυμορφισμού. Ένα από αυτά είναι η ενσωματωμένη συνάρτηση len()
, η οποία μπορεί να χρησιμοποιηθεί για να υπολογίσει το μήκος διάφορων αντικειμένων, όπως λίστες, συμβολοσειρές και λεξικά. Η συνάρτηση len()
παρέχει μια γενική λειτουργία για τον υπολογισμό του μήκους, ανεξάρτητα από τον τύπο του αντικειμένου που δίνεται ως όρισμα.
Παρακάτω παρατίθενται μερικά παραδείγματα της χρήσης της len() σε διαφορετικά αντικείμενα:
# Χρήση της len() σε μια συμβολοσειρά string_example = "Γεια σου, κόσμε!" print(len(string_example)) # Εμφανίζει 16 # Χρήση της len() σε μια λίστα list_example = [1, 2, 3, 4, 5] print(len(list_example)) # Εμφανίζει 5 # Χρήση της len() σε ένα λεξικό dict_example = {'apple': 1, 'banana': 2, 'orange': 3} print(len(dict_example)) # Εμφανίζει 3
Ο παραπάνω κώδικας παρουσιάζει τη χρήση της συνάρτησης len()
σε διάφορα δεδομένα.
- Αρχικά, ορίζεται μια μεταβλητή
string_example
που περιέχει τη συμβολοσειρά “Γεια σου, κόσμε!”. Στη συνέχεια, χρησιμοποιείται η συνάρτησηlen()
για να υπολογιστεί το μήκος της συμβολοσειράς και το αποτέλεσμα 16 εκτυπώνεται στην οθόνη. - Στη δεύτερη ενότητα, δημιουργείται μια λίστα με τα στοιχεία [1, 2, 3, 4, 5] και χρησιμοποιείται η συνάρτηση
len()
για να υπολογιστεί το πλήθος των στοιχείων της λίστας. Το αποτέλεσμα 5 εκτυπώνεται στην οθόνη. - Τέλος, δημιουργείται ένα λεξικό με τα ζευγάρια κλειδιών-τιμών {‘apple’: 1, ‘banana’: 2, ‘orange’: 3} και χρησιμοποιείται η συνάρτηση
len()
για να υπολογιστεί ο αριθμός των κλειδιών στο λεξικό. Το αποτέλεσμα 3 εκτυπώνεται στην οθόνη.
[adinserter block=”3″]
Για της πλειάδες (tuples), η συνάρτηση len() επιστρέφει τον αριθμό των στοιχείων που περιέχονται στην πλειάδα. Ακολουθεί ένα παράδειγμα:
# Δημιουργία μιας πλειάδας tuple_example = ('apple', 'banana', 'orange', 'grape') # Χρήση της len() για να βρούμε το μήκος της πλειάδας print(len(tuple_example)) # Εμφανίζει 4, δηλαδή τον αριθμό των στοιχείων στην πλειάδα
Ο κώδικας δημιουργεί μια πλειάδα με τέσσερα στοιχεία: ‘apple’, ‘banana’, ‘orange’ και ‘grape’. Στη συνέχεια, χρησιμοποιεί τη συνάρτηση len() για να υπολογίσει το μήκος της πλειάδας, δηλαδή τον αριθμό των στοιχείων που περιέχει. Το αποτέλεσμα, που είναι ο αριθμός 4, εκτυπώνεται στην οθόνη. Έτσι, ο κώδικας εμφανίζει το μήκος της πλειάδας.
Για τα λεξικά (dictionaries), η συνάρτηση len() επιστρέφει τον αριθμό των ζευγαριών κλειδί/τιμή που περιέχονται στο λεξικό. Ακολουθεί ένα παράδειγμα:
# Δημιουργία ενός λεξικού dict_example = {'apple': 1, 'banana': 2, 'orange': 3, 'grape': 4} # Χρήση της len() για να βρούμε το μήκος του λεξικού print(len(dict_example)) # Εμφανίζει 4, το μήκος του λεξικού dict_example
Ο παραπάνω κώδικας πραγματοποιεί τις ακόλουθες ενέργειες:
- Δημιουργεί ένα λεξικό με τη μορφή
dict_example
, το οποίο περιέχει τέσσερα ζευγάρια κλειδιών-τιμών. Τα κλειδιά είναι οι λέξεις “apple”, “banana”, “orange” και “grape”, ενώ οι τιμές είναι οι αντίστοιχοι ακέραιοι αριθμοί 1, 2, 3 και 4. - Χρησιμοποιεί τη συνάρτηση
len()
για να υπολογίσει το μήκος του λεξικούdict_example
. Η συνάρτησηlen()
επιστρέφει τον αριθμό των κλειδιών-τιμών που περιέχει το λεξικό. - Εκτυπώνει το μήκος του λεξικού με τη χρήση της εντολής
print()
. Η τιμή που εμφανίζεται στην οθόνη είναι ο αριθμός 4, καθώς το λεξικόdict_example
περιέχει τέσσερα ζευγάρια κλειδιών-τιμών.