Κληρονομικότητα Python (με παραδείγματα)

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

Βίντεο: Python Inheritance

Κληρονομικότητα στο Python

Το κληρονομικό είναι ένα ισχυρό χαρακτηριστικό στον αντικειμενοστρεφή προγραμματισμό.

Αναφέρεται στον ορισμό μιας νέας τάξης με μικρή ή καθόλου τροποποίηση σε μια υπάρχουσα τάξη. Η νέα τάξη ονομάζεται κλάση προέλευσης (ή θυγατρική) και αυτή από την οποία κληρονομείται ονομάζεται κλάση βάσης (ή γονέα) .

Σύνταξη Python Inheritance

 class BaseClass: Σώμα κλάσης βασικής κλάσης DerivedClass (BaseClass): Σώμα παραγόμενης κλάσης

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

Παράδειγμα κληρονομικότητας στην Python

Για να δείξουμε τη χρήση της κληρονομιάς, ας πάρουμε ένα παράδειγμα.

Ένα πολύγωνο είναι ένα κλειστό σχήμα με 3 ή περισσότερες πλευρές. Ας πούμε, έχουμε μια τάξη που ονομάζεται Polygonως εξής.

 class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = (0 for i in range(no_of_sides)) def inputSides(self): self.sides = (float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))

Αυτή η τάξη έχει χαρακτηριστικά δεδομένων για να αποθηκεύσει τον αριθμό πλευρών n και το μέγεθος κάθε πλευράς ως λίστα που ονομάζεται πλευρές.

Η inputSides()μέθοδος λαμβάνει το μέγεθος κάθε πλευράς και dispSides()εμφανίζει αυτά τα πλάγια μήκη.

Ένα τρίγωνο είναι ένα πολύγωνο με 3 πλευρές. Έτσι, μπορούμε να δημιουργήσουμε μια τάξη που ονομάζεται Τρίγωνο που κληρονομεί από το Πολύγωνο. Αυτό καθιστά όλα τα χαρακτηριστικά της κλάσης Polygon διαθέσιμα στην κατηγορία Triangle.

Δεν χρειάζεται να τα ορίσουμε ξανά (επαναχρησιμοποίηση κώδικα). Το τρίγωνο μπορεί να οριστεί ως εξής.

 class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)

Ωστόσο, η τάξη Triangleέχει μια νέα μέθοδο findArea()για την εύρεση και εκτύπωση της περιοχής του τριγώνου. Εδώ είναι ένα δείγμα εκτέλεσης.

 >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00

Μπορούμε να δούμε ότι παρόλο που δεν ορίσαμε μεθόδους όπως inputSides()ή dispSides()για τάξη Triangleξεχωριστά, μπορέσαμε να τις χρησιμοποιήσουμε.

Εάν ένα χαρακτηριστικό δεν βρίσκεται στην ίδια την κλάση, η αναζήτηση συνεχίζεται στην βασική κλάση. Αυτό επαναλαμβάνεται αναδρομικά, εάν η βασική κλάση προέρχεται από άλλες κατηγορίες.

Παράκαμψη μεθόδου στο Python

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

Γενικά, όταν παρακάμπτουμε μια βασική μέθοδο, τείνουμε να επεκτείνουμε τον ορισμό αντί να τον αντικαθιστούμε απλώς. Το ίδιο γίνεται κάνοντας κλήση της μεθόδου στη βασική κλάση από αυτήν στην παράγωγη κλάση (κλήση Polygon.__init__()από __init__()μέσα Triangle).

Μια καλύτερη επιλογή θα ήταν να χρησιμοποιήσετε την ενσωματωμένη λειτουργία super(). Έτσι, super().__init__(3)είναι ισοδύναμο Polygon.__init__(self,3)και προτιμάται. Για να μάθετε περισσότερα σχετικά με τη super()λειτουργία στο Python, επισκεφθείτε τη λειτουργία Python super ().

Δύο ενσωματωμένες συναρτήσεις isinstance()και issubclass()χρησιμοποιούνται για τον έλεγχο κληρονομιών.

Η συνάρτηση isinstance()επιστρέφει Trueεάν το αντικείμενο είναι μια παρουσία της κλάσης ή άλλων κλάσεων που προέρχονται από αυτήν. Κάθε τάξη στο Python κληρονομείται από την βασική τάξη object.

 >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

Ομοίως, issubclass()χρησιμοποιείται για τον έλεγχο κληρονομιάς τάξης.

 >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

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