Δημοσιεύτηκε: 25 Αύγ 2011, 00:47
Σύντομη απάντηση: H super είναι syntactic sugar για να καλέσεις μία μέθοδο της υπερκλάσης σου.
Παράδειγμα :
Έχεις την υπερκλάση Super και την υποκλάση Sub. Η Sub κληρονομεί τις μεθόδους και τις ιδιότητες της Super. Έστω τώρα ότι η Super έχει μια μέθοδο με όνομα my_method. Η κλάση Sub κληρονομεί την my_method και μπορεί να την καλέσει (υπάρχει στο namespace της). Έστω τώρα ότι η my_method της Super δε σου κάνει για κάποιο λόγο και θέλεις να την αλλάξεις. Πας λοιπόν στο σώμα της Sub και την ξαναορίζεις.
Όλα καλά ώς εδώ. Αν όμως χρειαστείς να καλέσεις την my_method της Super τι κάνεις? Χρησιμοποιείς την super()!!! Το πιο χαρακτηριστικό παράδειγμα είναι η μέθοδοι __init__ (θυμίσου είναι οι "constructors") των κλάσεων. Όλες οι κλάσεις την έχουν. Χρησιμοποιώντας την super() στην __init__() της Sub, καλείς την __init__() της Super. Δεν είναι πάντα απαραίτητο αυτό, αλλά 99/100 είναι καλύτερα να το κάνεις (το σίγουρο είναι ότι δε χάνεις).
Προσπάθησε να καταλάβεις τον ακόλουθο κώδικα - τι θα εκτυπώσει. (μόνο για Python 3)
To output είναι αυτό:
Αν ξέρεις να χρησιμοποιείς τον pdbθα σε βοηθήσει να δεις βήμα βήμα την πορεία εκτέλεσης.
Κάτι άλλο που κάνει η super είναι ότι βοηθάει να δουλέψει σωστά η πολλαπλή κληρονομικότητα (diamond inheritance).
Δες εδώκαι εδώ. Στο google θα βρεις πολύ (και καλύτερο) υλικό.
Παράδειγμα :
Έχεις την υπερκλάση Super και την υποκλάση Sub. Η Sub κληρονομεί τις μεθόδους και τις ιδιότητες της Super. Έστω τώρα ότι η Super έχει μια μέθοδο με όνομα my_method. Η κλάση Sub κληρονομεί την my_method και μπορεί να την καλέσει (υπάρχει στο namespace της). Έστω τώρα ότι η my_method της Super δε σου κάνει για κάποιο λόγο και θέλεις να την αλλάξεις. Πας λοιπόν στο σώμα της Sub και την ξαναορίζεις.
Όλα καλά ώς εδώ. Αν όμως χρειαστείς να καλέσεις την my_method της Super τι κάνεις? Χρησιμοποιείς την super()!!! Το πιο χαρακτηριστικό παράδειγμα είναι η μέθοδοι __init__ (θυμίσου είναι οι "constructors") των κλάσεων. Όλες οι κλάσεις την έχουν. Χρησιμοποιώντας την super() στην __init__() της Sub, καλείς την __init__() της Super. Δεν είναι πάντα απαραίτητο αυτό, αλλά 99/100 είναι καλύτερα να το κάνεις (το σίγουρο είναι ότι δε χάνεις).
Προσπάθησε να καταλάβεις τον ακόλουθο κώδικα - τι θα εκτυπώσει. (μόνο για Python 3)
- Κώδικας: Επιλογή όλων
class Super(object):
def __init__(self):
super().__init__()
print("I am at Super!!!")
self.my_method()
def my_method(self):
print("Super's my_method")
class Sub(Super):
def __init__(self):
super().__init__()
print("I am at Sub!!!")
self.my_method()
super().my_method()
def my_method(self):
print("Sub's my_method")
def main():
a = Sub()
if __name__ == "__main__":
main()
To output είναι αυτό:
Spoiler: show
Αν ξέρεις να χρησιμοποιείς τον pdbθα σε βοηθήσει να δεις βήμα βήμα την πορεία εκτέλεσης.
Κάτι άλλο που κάνει η super είναι ότι βοηθάει να δουλέψει σωστά η πολλαπλή κληρονομικότητα (diamond inheritance).
Δες εδώκαι εδώ. Στο google θα βρεις πολύ (και καλύτερο) υλικό.