Το super () builtin επιστρέφει ένα αντικείμενο διακομιστή μεσολάβησης (προσωρινό αντικείμενο του superclass) που μας επιτρέπει να έχουμε πρόσβαση σε μεθόδους της βασικής κλάσης.
Στο Python, super()έχει δύο μεγάλες περιπτώσεις χρήσης:
- Μας επιτρέπει να αποφύγουμε ρητά τη χρήση του ονόματος βασικής τάξης
- Εργασία με πολλαπλή κληρονομικότητα
Παράδειγμα 1: super () με Ενιαία Κληρονομικότητα
Στην περίπτωση μίας κληρονομιάς, μας επιτρέπει να αναφέρουμε την βασική τάξη από super().
class Mammal(object): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') class Dog(Mammal): def __init__(self): print('Dog has four legs.') super().__init__('Dog') d1 = Dog()
Παραγωγή
Ο σκύλος έχει τέσσερα πόδια. Ο σκύλος είναι ένα θερμόαιμο ζώο.
Εδώ, καλέσαμε τη __init__()μέθοδο της τάξης των θηλαστικών (από την κατηγορία Dog) χρησιμοποιώντας κώδικα
σούπερ () .__ init __ («Dog»)
αντί
Θηλαστικό .__ init __ (εαυτό, «Dog»)
Δεδομένου ότι δεν χρειάζεται να καθορίσουμε το όνομα της βασικής κλάσης όταν καλούμε τα μέλη της, μπορούμε εύκολα να αλλάξουμε το όνομα της βασικής κλάσης (αν χρειαστεί).
# changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')
Το super()ενσωματωμένο επιστρέφει ένα αντικείμενο διακομιστή μεσολάβησης, ένα υποκατάστατο αντικείμενο που μπορεί να καλέσει μεθόδους της βασικής κλάσης μέσω ανάθεσης. Αυτό ονομάζεται έμμεση (ικανότητα αναφοράς βασικού αντικειμένου με super())
Δεδομένου ότι η έμμεση υπολογίζεται κατά το χρόνο εκτέλεσης, μπορούμε να χρησιμοποιήσουμε διαφορετικές κατηγορίες βάσης σε διαφορετικούς χρόνους (αν χρειαστεί).
Παράδειγμα 2: super () με πολλαπλή κληρονομικότητα
class Animal: def __init__(self, Animal): print(Animal, 'is an animal.'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "can't fly.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "can't swim.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Dog has 4 legs.'); super().__init__('Dog') d = Dog() print('') bat = NonMarineMammal('Bat')
Παραγωγή
Ο σκύλος έχει 4 πόδια. Ο σκύλος δεν μπορεί να κολυμπήσει. Ο σκύλος δεν μπορεί να πετάξει. Ο σκύλος είναι ένα θερμόαιμο ζώο. Ο σκύλος είναι ένα ζώο. Το ρόπαλο δεν μπορεί να κολυμπήσει. Το ρόπαλο είναι ένα θερμόαιμο ζώο. Το ρόπαλο είναι ένα ζώο.
Παραγγελία ανάλυσης μεθόδου (MRO)
Method Resolution Order (MRO) είναι η σειρά με την οποία οι μέθοδοι πρέπει να κληρονομηθούν παρουσία πολλών κληρονομιών. Μπορείτε να δείτε το MRO χρησιμοποιώντας το __mro__χαρακτηριστικό.
>>> Σκύλος .__ mro__ (,,,,,)
Δείτε πώς λειτουργεί το MRO:
- Μια μέθοδος στις παραγόμενες κλήσεις καλείται πάντα πριν από τη μέθοδο της βασικής κλάσης.
Στο παράδειγμά μας, η κατηγορία Dog ονομάζεται πριν από το NonMarineMammal ή το NoneWingedMammal. Αυτές οι δύο κατηγορίες ονομάζονται πριν από το θηλαστικό, το οποίο καλείται πριν από το ζώο, και η κατηγορία των ζώων καλείται πριν από το αντικείμενο. - Εάν υπάρχουν πολλοί γονείς όπως
Dog(NonMarineMammal, NonWingedMammal), οι μέθοδοι του NonMarineMammal καλούνται πρώτα επειδή εμφανίζονται πρώτα.
Για να μάθετε περισσότερα super(), επισκεφτείτε το σούπερ Python () που θεωρείται σούπερ!








