Κληρονομικότητα (Inheritance)

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

Γενικές αρχές για κληρονομικότητα και υποκλάσεις

  • Μια κλάση που παράγεται από μια άλλη κλάση καλείται υποκλάση (subclass) ή παραγόμενη κλάση (derived) ή θυγατρική κλάση (child).
  • Η κλάση από την οποία παράγεται μια κλάση λέγεται υπερκλάση (superclass) ή γονική κλάση (parent) ή βασική κλάση (base).
  • Μια υποκλάση έχει τις δικές της μεταβλητές, συναρτήσεις και κατασκευαστή όπως κάθε άλλη κλάση.
  • Μια υποκλάση κληρονομεί (inherit) τις ιδιότητες και μεθόδους της υπερκλάσης αλλά όχι τον αρχικοποιητή, μπορεί όμως να έχει πρόσβαση σε αυτόν.
  • Για να δηλώσουμε ότι μια κλάση, έστω Manager είναι υποκλάση ή κληρονομεί την κλάση έστω Employee, γράφουμε: class Manager(Employee)
  • Μια κλάση μπορεί να κληρονομεί περισσότερες της μίας κλάσης (ισχύει η πολυκληρονομικότητα ή Multiple Inheritance).
  • Μια κλάση μπορεί να κληρονομεί μια κλάση η οποία μπορεί να κληρονομεί μια άλλη κλάση ... κ.λπ. (Πολυεπίπεδη κληρονομικότητα ή Multilevel Inheritance)
  • Όταν καλείται μια μέθοδος ή ο αρχικοποιητής μιας υπερκλάσης τότε μπαίνει και το πρόθεμα Parent. όπου Parent το όνομα της υπερκλάσης.
class Product:
  fpa = 0.2

  def setPrice(self, price): # μέθοδος με παράμετρο
    self.price = price

  def totalCost(self): # μέθοδος χωρίς παράμετρο (εξαιρείται το self)
    return self.price * (1 + Product.fpa)

class Fruit(Product):
  category = "fruits"

  def __init__(self, name):
    self.name = name

apple = Fruit("Μήλο") # δημιουργία αντικειμένου
apple.setPrice(1.75) # κλήση γονικής μεθόδου
print(apple.totalCost()) # εκτύπωση με κλήση γονικής μεθόδου

Πολυκληρονομικότητα (Multiple Inheritance)

Στην python ισχύει η πολυκληρονομικότητα. Δηλαδή μια κλάση μπορεί να κληρονομεί ταυτόχρονα από πολλές κλάσεις.

Απλό παράδειγμα πολυκληρονομικότητας.

class A:
    # ιδιότητες κλάσης A
    # μέθοδοι κλάσης A

class B:
    # ιδιότητες κλάσης Β
    # μέθοδοι κλάσης Β

class C(A, B):
    # Η C κληρονομεί από τις Α και Β
    # Προσθέτει και τις δικές της

Πολυεπίπεδη κληρονομικότητα (Multilevel Inheritance)

Απλό παράδειγμα πολυεπίπεδης κληρονομικότητας.

class A:
    # ιδιότητες κλάσης A

class B(A):
    # η B κληρονομεί τις ιδιότητες της A
    # προσθέτει και τις δικές της

class C(B):
    # η C κληρονομεί τις ιδιότητες της B
    # η C κληρονομεί και τις ιδιότητες της Α μέσω Β
    # προσθέτει και τις δικές της

Η μέθοδος issubclass()

Με την issubclass() μπορείτε να ελέγξετε αν μια κλάση είναι υποκλάση κάποιας άλλης.

Η σύνταξη είναι:

issubclass(Child, Parent)

Επιστρέφει True ή False.

Στη θέση των κλάσεων μπορεί να είναι και αντίστοιχα αντικείμενα.

issubclass(ChildObject, ParentObject)