Python super ()

Το 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 () που θεωρείται σούπερ!

ενδιαφέροντα άρθρα...