Η κληρονομικότητα είναι χρήσιμη, αλλά μπορείτε να ξεκλειδώσετε πλήρως τις δυνατότητές της χρησιμοποιώντας εκ νέου κώδικα από βασικές κλάσεις.

Βασικά Takeaways

  • Η συνάρτηση super() της Python σάς επιτρέπει να καλείτε μεθόδους superclass από μια υποκλάση, διευκολύνοντας την εφαρμογή κληρονομικότητας και παράκαμψης μεθόδων.
  • Η συνάρτηση super() σχετίζεται στενά με τη σειρά ανάλυσης μεθόδου (MRO) στην Python, η οποία καθορίζει τη σειρά με την οποία αναζητούνται οι προγονικές κλάσεις για μεθόδους ή χαρακτηριστικά.
  • Η χρήση super() σε κατασκευαστές κλάσεων είναι μια κοινή πρακτική για την προετοιμασία κοινών χαρακτηριστικών στη γονική κλάση και πιο συγκεκριμένων στη θυγατρική κλάση. Η αποτυχία χρήσης της super() μπορεί να οδηγήσει σε ακούσιες συνέπειες, όπως λείπουν αρχικοποιήσεις χαρακτηριστικών.

Ένα από τα βασικά χαρακτηριστικά της Python είναι το παράδειγμά της OOP, το οποίο μπορείτε να χρησιμοποιήσετε για να μοντελοποιήσετε οντότητες του πραγματικού κόσμου και τις σχέσεις τους.

Όταν εργάζεστε με κλάσεις Python, θα χρησιμοποιείτε συχνά κληρονομικότητα και θα παρακάμπτετε τα χαρακτηριστικά ή τις μεθόδους μιας υπερκλάσης. Η Python παρέχει ένα

instagram viewer
σούπερ() συνάρτηση που σας επιτρέπει να καλέσετε τις μεθόδους της υπερκλάσης από την υποκλάση.

Τι είναι το super() και γιατί το χρειάζεστε;

Χρησιμοποιώντας την κληρονομικότητα, μπορείτε να δημιουργήσετε μια νέα κλάση Python που κληρονομεί τα χαρακτηριστικά μιας υπάρχουσας κλάσης. Μπορείτε επίσης να παρακάμψετε μεθόδους της υπερκλάσης στην υποκλάση, παρέχοντας εναλλακτικές υλοποιήσεις. Ωστόσο, ίσως θελήσετε να χρησιμοποιήσετε τη νέα λειτουργικότητα εκτός από την παλιά, αντί για αυτήν. Σε αυτήν την περίπτωση, σούπερ() είναι χρήσιμο.

Μπορείτε να χρησιμοποιήσετε το σούπερ() συνάρτηση για πρόσβαση σε χαρακτηριστικά superclass και επίκληση μεθόδων της superclass. Το σούπερ είναι απαραίτητο για αντικειμενοστραφής προγραμματισμός γιατί διευκολύνει την εφαρμογή της κληρονομικότητας και της παράκαμψης μεθόδου.

Πώς λειτουργεί το super();

Εσωτερικώς, σούπερ() συνδέεται στενά με το Εντολή επίλυσης μεθόδου (MRO) στην Python, την οποία καθορίζει ο αλγόριθμος γραμμικοποίησης C3.

Να πώς σούπερ() έργα:

  1. Προσδιορίστε την τρέχουσα κλάση και παράδειγμα: Όταν τηλεφωνείς σούπερ() μέσα σε μια μέθοδο μιας υποκλάσης, η Python υπολογίζει αυτόματα την τρέχουσα κλάση (η κλάση που περιέχει τη μέθοδο που καλεί σούπερ()) και το παράδειγμα αυτής της κλάσης (δηλ. εαυτός).
  2. Προσδιορίστε την υπερτάξη: σούπερ() παίρνει δύο ορίσματα—την τρέχουσα κλάση και την παρουσία—τα οποία δεν χρειάζεται να περάσετε ρητά. Χρησιμοποιεί αυτές τις πληροφορίες για να προσδιορίσει την υπερκλάση για να εκχωρήσει την κλήση μεθόδου. Αυτό το κάνει εξετάζοντας την ιεραρχία της τάξης και το MRO.
  3. Επικαλέστε τη μέθοδο στην Superclass: Μόλις καθοριστεί η υπερκλάση, σούπερ() σας επιτρέπει να καλείτε τις μεθόδους του σαν να τις καλούσατε απευθείας από την υποκλάση. Αυτό σας δίνει τη δυνατότητα να επεκτείνετε ή να παρακάμπτετε μεθόδους ενώ εξακολουθείτε να χρησιμοποιείτε την αρχική υλοποίηση από την superclass.

Χρήση super() σε έναν κατασκευαστή κλάσης

Χρησιμοποιώντας σούπερ() Ο κατασκευαστής σε μια κλάση είναι κοινή πρακτική, καθώς συχνά θα θέλετε να αρχικοποιήσετε κοινά χαρακτηριστικά στη γονική κλάση και πιο συγκεκριμένα στη θυγατρική.

Για να το αποδείξουμε αυτό, ορίστε μια κλάση Python, Πατέρας, που α Υιός η κλάση κληρονομεί από:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

μεσα στην Υιός κατασκευαστής, η κλήση προς super().init() επικαλείται το Πατέρας κατασκευαστής κλάσης, περνώντας το όνομα και επίθετο ως παραμέτρους. Αυτό διασφαλίζει ότι το Πατέρας Η κλάση μπορεί ακόμα να ορίσει σωστά τα χαρακτηριστικά του ονόματος, ακόμη και στο a Υιός αντικείμενο.

Αν δεν τηλεφωνήσετε σούπερ() σε έναν κατασκευαστή κλάσης, ο κατασκευαστής της γονικής του κλάσης δεν θα εκτελεστεί. Αυτό μπορεί να οδηγήσει σε ακούσιες συνέπειες, όπως η έλλειψη αρχικοποίησης χαρακτηριστικών ή η ατελής ρύθμιση της κατάστασης της γονικής κλάσης:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Εάν τώρα προσπαθήσετε να καλέσετε το Πάρτε πληροφορίες μέθοδο, θα αυξήσει ένα Χαρακτηριστικό Σφάλμα επειδή η self.first_name και self.last_name τα χαρακτηριστικά δεν έχουν αρχικοποιηθεί.

Χρήση super() στις Μέθοδοι Τάξης

Μπορείς να χρησιμοποιήσεις σούπερ() σε άλλες μεθόδους, εκτός από τους κατασκευαστές, με τον ίδιο ακριβώς τρόπο. Αυτό σας επιτρέπει να επεκτείνετε ή να παρακάμψετε τη συμπεριφορά της μεθόδου της υπερκλάσης.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

ο Υιός κλάση κληρονομεί από το Πατέρας και έχει το δικό του μιλώ μέθοδος. ο μιλώ μέθοδος του Υιός χρήσεις της τάξης super().speak() να καλέσει το μιλώ μέθοδος του Πατέρας τάξη. Αυτό του επιτρέπει να συμπεριλάβει το μήνυμα από τη γονική τάξη ενώ το επεκτείνει με ένα μήνυμα ειδικά για τη θυγατρική τάξη.

Αποτυχία χρήσης σούπερ() σε μια μέθοδο που παρακάμπτει μια άλλη σημαίνει ότι η λειτουργικότητα που υπάρχει στη μέθοδο γονικής κλάσης δεν θα τεθεί σε ισχύ. Αυτό έχει ως αποτέλεσμα την πλήρη αντικατάσταση της συμπεριφοράς της μεθόδου, η οποία μπορεί να οδηγήσει σε συμπεριφορά που δεν είχατε σκοπό.

Κατανόηση Εντολή ανάλυσης μεθόδου

Η σειρά ανάλυσης μεθόδου (MRO) είναι η σειρά με την οποία η Python αναζητά ancestorclasses όταν αποκτάτε πρόσβαση σε μια μέθοδο ή ένα χαρακτηριστικό. Το MRO βοηθά την Python να καθορίσει ποια μέθοδο θα καλέσει όταν υπάρχουν πολλαπλές ιεραρχίες κληρονομικότητας.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Δείτε τι συμβαίνει όταν δημιουργείτε μια παρουσία του Λάγος τάξη και καλέστε το Πολιτισμός μέθοδος:

  1. Η Python ξεκινά αναζητώντας το Πολιτισμός μέθοδος στο Λάγος η ίδια η τάξη. Εάν το βρει, καλεί τη μέθοδο. Αν όχι, προχωρά στο δεύτερο βήμα.
  2. Αν δεν βρει το Πολιτισμός μέθοδος στο Λάγος class, η Python εξετάζει τις βασικές κλάσεις με τη σειρά που εμφανίζονται στον ορισμό της κλάσης. Σε αυτήν την περίπτωση, Λάγος κληρονομεί πρώτα από Αφρική και μετά από Νιγηρία. Έτσι, η Python θα αναζητήσει το Πολιτισμός μέθοδος σε Αφρική πρώτα.
  3. Αν δεν βρει το Πολιτισμός μέθοδος στο Αφρική τάξη, η Python θα κοιτάξει στη συνέχεια Νιγηρία τάξη. Αυτή η συμπεριφορά συνεχίζεται μέχρι να φτάσει στο τέλος της ιεραρχίας και παρουσιάζει ένα σφάλμα εάν δεν μπορεί να βρει τη μέθοδο σε καμία από τις υπερτάξεις.

Η έξοδος δείχνει τη σειρά επίλυσης μεθόδων του Λάγος, ξεκινώντας από αριστερά προς τα δεξιά.

Κοινές παγίδες και βέλτιστες πρακτικές

Όταν εργάζεστε με σούπερ(), υπάρχουν μερικές κοινές παγίδες που πρέπει να αποφύγετε.

  1. Λάβετε υπόψη σας την εντολή επίλυσης μεθόδου, ειδικά σε πολλαπλά σενάρια κληρονομιάς. Εάν χρειάζεται να χρησιμοποιήσετε σύνθετη πολλαπλή κληρονομικότητα, θα πρέπει να είστε εξοικειωμένοι με το Γ3 Αλγόριθμος γραμμικοποίησης που χρησιμοποιεί η Python για να προσδιορίσει το MRO.
  2. Αποφύγετε τις κυκλικές εξαρτήσεις στην ιεραρχία της τάξης σας, που μπορεί να οδηγήσουν σε απρόβλεπτη συμπεριφορά.
  3. Τεκμηριώστε τον κωδικό σας με σαφήνεια, ειδικά κατά τη χρήση σούπερ() σε σύνθετες ιεραρχίες κλάσεων, για να γίνει πιο κατανοητό για άλλους προγραμματιστές.

Χρησιμοποιήστε το super() με τον σωστό τρόπο

της Python σούπερ() Η λειτουργία είναι μια ισχυρή δυνατότητα όταν εργάζεστε με παράκαμψη κληρονομικότητας και μεθόδου. Κατανοώντας πώς σούπερ() λειτουργεί και ακολουθώντας τις βέλτιστες πρακτικές θα σας επιτρέψει να δημιουργήσετε πιο διατηρήσιμο και αποτελεσματικό κώδικα στα έργα σας στην Python.