1. Panagiotis Mavrogiorgos
  2. Python Tutorial (Greek)

Commits

Panagiotis Mavrogiorgos  committed 5e7d43f

Expanded Inheritance.

  • Participants
  • Parent commits d4fd380
  • Branches default

Comments (0)

Files changed (3)

File .hgignore

View file
 syntax: glob
 
-./docs/build/*
+./build/*
 *.pdf
 *.png
 *.o

File source/index.rst

View file
 :Author: Panagiotis Mavrogiorgos
 :Source code: http://bitbucket.org/pmav99/python_tutorial
 :Generated: |today|
-:License: Creative Commons Share Alike
+:License: `Creative Commons Attribution-Share Alike 3.0 <https://creativecommons.org/licenses/by-sa/3.0/us/>`_
 :Version: |release|
 
 Contents:

File source/object_oriented_programming.rst

View file
 παραδείγματα προσφέρεται περισσότερο για την επίλυση ενός συγκεκριμένου
 προβλήματος.
 
-.. Hint::
+.. Note::
 
     Το πιο χαρακτηριστικό ίσως παράδειγμα προβλήματος που προσφέρεται
     για λύση μέσω αντικειμενοστραφούς προγραμματισμού είναι ο σχεδιασμός GUI.
 ====================================================
 
 Μία από τις πλέον συνήθεις εκφράσεις στα κείμενα που αναφέρονται στην Python
-είναι ότι στην Python "`τα πάντα είναι αντικείμενα`" (everything is an object).
+είναι ότι "`τα πάντα είναι αντικείμενα`" (everything is an object).
 Ευθύς αμέσως φυσικά, μέσα από την φράση αυτή ξεπηδούν δύο ερωτήματα:
 
 * Τι είναι τα αντικείμενα (objects);
 Το πρώτο ερώτημα θα το απαντήσουμε στην επόμενη ενότητα.  Το δεύτερο ερώτημα
 μπορεί όμως να απαντηθεί πολύ πολύ σύντομα.  Τα *αντικείμενα* (objects)
 δημιουργούνται από τις *κλάσεις* (classes).  Για την ακρίβεια μάλιστα, οι
-κλάσεις ορίζονται ως `εργοστάσια αντικειμένων` (object factories).  Είναι
+κλάσεις ορίζονται ως *εργοστάσια αντικειμένων* (object factories).  Είναι
 δηλαδή, τα στοιχεία εκείνα της γλώσσας, τα οποία κατασκευάζουν αντικείμενα
 (objects).  Προκειμένου βέβαια να γίνει καλύτερα κατανοητό αυτό θα πρέπει πρώτα
 να δούμε τι είναι τα αντικείμενα.
 
     Την κανονική σύνταξη της Python θα την δούμε στη συνέχεια.
 
-Μια κλάση δεν είναι τίποτα άλλο παρά το ένας ορισμός. Αυτό που ορίζει είναι το
+Μια κλάση δεν είναι τίποτα άλλο παρά ένας ορισμός. Αυτό που ορίζει είναι το
 ποιες ιδιότητες (attributes) και ποιες μεθόδους (methods) θα έχει ένα
 αντικείμενο.
 
 
 H πρώτη γραμμή είναι αυτή στην οποία ορίζεται το όνομα της κλάσης.  Προσέξτε την
 παρουσία των παρενθέσεων.  Τη χρήση τους θα τη δούμε στη συνέχεια.  Οι γραμμές
-που ακολουθούν, αποτελούν το σώμα της συνάρτησης (class body).  Στη συγκεκριμένη
+που ακολουθούν, αποτελούν το *σώμα της κλάσης* (class body).  Στη συγκεκριμένη
 περίπτωση, ορίσαμε ότι οι γάτες που θα δημιουργηθούν από την κλάση αυτή, θα
-έχουν 3 ιδιότητες (``όνομα, ηλικία`` και ``φύλο``) και θα μπορούν να κάνουν
+έχουν 3 ιδιότητες (``όνομα, ηλικία`` και ``φύλο``) και θα μπορούν να εκτελούν
 2 ενέργειες (θα έχουν 2 μεθόδους δηλαδή) , να ``τρώνε`` και να ``κοιμούνται``.
 
 Όλες οι γάτες που θα δημιουργηθούν από την κλάση αυτή θα έχουν μόνο αυτές τις
 
 .. Note::
 
-    Υπενθυμίζουμε ότι προηγουμένως ορίσαμε τις κλάσεις σαν "εργοστάσιο
-    αντικειμένων" (factory object). Ακριβώς όπως ένα εργοστάσιο που φτιάχνει
+    Υπενθυμίζουμε ότι προηγουμένως ορίσαμε τις κλάσεις σαν *εργοστάσιο
+    αντικειμένων* (factory object). Ακριβώς όπως ένα εργοστάσιο που φτιάχνει
     καρέκλες μπορεί να κατασκευάσει καρέκλες διαφορετικού σχεδίου, διαστάσεων
     και χρώματος σε όποια ποσότητα επιθυμεί, έτσι και οι κλάσεις μπορούν να
     κατασκευάσουν αντικείμενα με διαφορετικές ιδιότητες σε όποια ποσότητα
 
 Όλα τα νέα αντικείμενα θα έχουν ακριβώς τις ίδιες ιδιότητες (attributes) και τις
 ίδιες μεθόδους.  Οι τιμές των ιδιοτήτων τους όμως θα είναι διαφορετικές μεταξύ
-τους.
+τους. Μπορούμε φυσικά να δώσουμε ακριβώς τις ίδιες τιμές στις ιδιότητες, οπότε θα
+δημιουργηθούν δύο όμοια αντικείμενα, αλλά συνήθως δεν έχουμε λόγο να κάνουμε
+κάτι τέτοιο.
 
-Στην ορολογία του αντικειμενικοστραφούς Προγραμματισμού, όλα τα νέα αντικείμενα
+Στην ορολογία του Αντικειμενικοστραφούς Προγραμματισμού, όλα τα νέα αντικείμενα
 που δημιουργούνται από μία κλάση ονομάζονται *στιγμιότυπα* (instances).
 
 .. Note::
     Όπως μία φωτογραφία ενός αθλητή που τρέχει αποτελεί την απεικόνιση μίας μόνο
     από όλες τις θέσεις που πέρασε κατά τη διάρκεια του αγώνα του, έτσι και μία
     instance αποτελεί μία μόνο αποτύπωση όλων των δυνατών συνδυασμών που μπορούν
-    να πάρουν οι ιδιότητες μιας κλάσης.
+    να έχουν οι ιδιότητες μιας κλάσης.
 
 Πρόσβαση σε ιδιότητες και μεθόδους
 ==================================
 ----------------------------
 
 Αν προσέξουμε τον ορισμό των μεθόδων μέσα στο σώμα της κλάσης, θα δούμε ότι δε
-διαφέρουν από τον ορισμό των συναρτήσεων.  Μία μέθοδος δεν είναι τίποτα άλλο παρά μία συνάρτηση
-που *ανήκει* σε ένα αντικείμενο.  Όλα όσα ξέρουμε για τις τυπικές συναρτήσεις
-της Python ισχύουν και εδώ.  Μπορούμε να δώσουμε έξτρα ορίσματα (arguments) σε
-μία μέθοδο κτλ.  Πχ ας ξαναορίσουμε την κλάση της Γάτας, βάζοντας αυτή τη φορά
-υποχρεωτικά ορίσματα στις μεθόδους της::
+διαφέρουν από τον ορισμό των συναρτήσεων.  Μία μέθοδος δεν είναι τίποτα άλλο
+παρά μία συνάρτηση που *ανήκει* σε ένα αντικείμενο.  Όλα όσα ξέρουμε για τις
+τυπικές συναρτήσεις της Python ισχύουν και εδώ.  Μπορούμε να δώσουμε έξτρα
+ορίσματα (arguments) σε μία μέθοδο κτλ.  Πχ ας ξαναορίσουμε την κλάση της Γάτας,
+βάζοντας αυτή τη φορά υποχρεωτικά ορίσματα στις μεθόδους της::
 
     class Cat():
         name
         def sleep(time):
             print("%s is sleeping for %d minutes." % (name, time))
 
-.. Warning::
-
-    Το ότι οι μέθοδοι είναι ακριβώς ίδιες με τις συναρτήσεις δεν είναι απόλυτα
-    ακριβές. Στην ψευδογλώσσα που χρησιμοποιούμε, ισχύει μεν κάτι τέτοιο αλλά
-    στην Python οι μέθοδοι έχουν μία διαφορά από τις συναρτήσεις.  Κρατήστε το
-    στο μυαλό σας, αλλά για την ώρα δεν είναι σημαντικό.
-
 Αυτή τη φορά λοιπόν, θα μπορούμε να πούμε στις γάτες που θα δημιουργήσουμε τι να
 φάνε και πόση ώρα να κοιμηθούνε.  Πχ με τον ακόλουθο κώδικα, θα δημιουργήσουμε
 μια γάτα στην οποία θα πούμε πρώτα να φάει ποντίκια, στη συνέχεια να κοιμηθεί
     συμπεριφορά των αντικειμένων που θα δημιουργηθούν. Στον πραγματικό κόσμο
     πάλι όχι...
 
+.. Warning::
+
+    Το ότι οι μέθοδοι είναι ακριβώς ίδιες με τις συναρτήσεις δεν είναι απόλυτα
+    ακριβές. Στην ψευδογλώσσα που χρησιμοποιούμε, ισχύει μεν κάτι τέτοιο αλλά
+    στην Python οι μέθοδοι έχουν μία διαφορά από τις συναρτήσεις.  Κρατήστε το
+    στο μυαλό σας, αν και για την ώρα δεν είναι σημαντικό.
+
 Κληρονομικότητα (Inheritance)
 =============================
 
 *κληρονομεί* όλες τις ιδιότητες και τις μεθόδους μιας άλλης κλάσης.
 Χρησιμοποιώντας λίγο πιο επίσημη ορολογία, λέμε ότι η κλάση που ορίζεται πρώτη
 είναι η *βασική κλάση* (base class) και η κλάση που κληρονομεί τη βάσική κλάση
-ονομάζεται *παράγωγη* (derived class). Εναλλακτικά οι βασικές κλάσεις ονομάζονται
-και *Υπερκλάσεις* ενώ οι παράγωγες κλάσεις ονομάζονται *Υποκλάσεις*.
+ονομάζεται *παράγωγη κλάση* (derived class). Εναλλακτικά οι βασικές κλάσεις
+ονομάζονται και *υπερκλάσεις* ενώ οι παράγωγες κλάσεις ονομάζονται *υποκλάσεις*.
 
 Ας δούμε ένα παράδειγμα::
 
 
 H υπερκλάση (``BaseClass``) δεν έχει καμία διαφορά από τις κλάσεις που έχουμε
 δει ως τώρα. H υποκλάση (``DerivedClass``) όμως χρησιμοποιεί ελαφρά διαφορετική
-σύνταξη. Αντί οι παρενθέσεις της πρώτης γραμμής του ορισμού της να είναι κενές,
-π.χ.::
+σύνταξη. Αντί οι παρενθέσεις της πρώτης γραμμής του ορισμού της να είναι κενές::
 
     class DerivedClass():
         pass
 
 Αυτή η μικρή διαφορά στη σύνταξη κάνει όλη τη διαφορά! Με τον τρόπο αυτό, οι
 instances της ``DerivedClass`` αποκτούν όλες τις ιδιότητες και όλες τις μεθόδους
-που ορίστηκαν στην ``BaseClass``!
-
-Ας δούμε ένα παράδειγμα. Θα δημιουργήσουμε δύο
-instances της ``DerivedClass`` και θα καλέσουμε τις μεθόδους που έχουν οριστεί
-στην ``BaseClass``::
+που ορίστηκαν στην ``BaseClass``!  Ας δούμε ένα παράδειγμα. Θα δημιουργήσουμε
+δύο instances της ``DerivedClass`` και θα καλέσουμε τις μεθόδους που έχουν
+οριστεί στην ``BaseClass``::
 
     # Class Instantiation
     instance1 = DerivedClass(attr1="value1", attr2="value2")
 
 .. Note::
 
-    Δηλαδή, προσθέτοντας μόνο το όνομα της υπερκλάσης στον ορισμό της κλάσης,
-    ο κωδικάς μας γίνεται ισοδύναμος με τον ακόλουθο::
+    Δηλαδή, προσθέτοντας το όνομα της υπερκλάσης στον ορισμό της κλάσης, (μέσα
+    στις παρενθέσεις της πρώτης γραμμής) ο ορισμός της ``DerivedClass`` γίνεται
+    ισοδύναμος με τον ακόλουθο::
 
         class DerivedClass():
             attr1
             def method2():
                 print("You just called method2.")
 
-Επειδή φαντάζομαι ότι το παραπάνω δεν είναι και πολύ ικανοποιητικό, ας δούμε ένα
-πιο χαρακτηριστικό παράδειγμα για τη χρήση της κληρονομικότητας. Θα ορίσουμε
-λοιπόν μία κλάση η οποία θα δημιουργεί θηλαστικά::
+Επειδή το παραπάνω είναι πολύ γενικό, ας δούμε και ένα πιο χειροπιαστό παράδειγμα.
+Θα ορίσουμε λοιπόν μία κλάση η οποία θα δημιουργεί Ζώα::
 
-
-    class Mamal():
+    class Animal():
         species
+        race
         sex
 
         def speak():
-            pass
+            print("I don't know what to say...")
 
-Η κλάση μας είναι μάλλον απλή. Ορίζει 2 ιδιότητες που είναι κοινές σε όλα τα
-θηλαστικά, το ``είδος`` και το ``φύλο`` και μία μέθοδο 
-και στη συνέχεια δύο κλάσεις
-που θα κληρονομούν από αυτή, μία κλάση που θα δημιουργεί Γάτες και μία που θα
-δημιουργεί Σκύλους::
+Στη συνέχεια θα ορίσουμε δύο κλάσεις που *εξειδικεύουν* την κλάση Ζώου::
 
-    class Cat(Mamal):
-        name
-
+    class Cat(Animal):
         def speak():
             print("Meow!")
 
-    class Dog(Mamal):
-        name
-
+    class Dog(Animal):
         def speak():
             print("Woof!")
 
+Οι κλάσεις *Σκύλου* και *Γατας* κληρονομούν τις ιδιότητες και τις μεθόδους της
+κλάσης *Ζώου*. Προσοχή στη μέθοδο ``speak()`` όμως! Όπως βλέπουμε και οι δύο
+υποκλάσεις **ξαναορίζουν** την μέθοδο που κληρονόμησαν από την υπερκλάση τους.
+Αυτό είναι μία από τις βασικότερες τεχνικές της Κληρονομικότητας (Inheritance).
+Οι υποκλάσεις δεν κληρονομούν απλά ιδιότητες (attributes) και μεθόδους
+(methods), αλλά μπορούν να ξαναορίσουν τις μεθόδους που κληρονόμησαν,
+**εξειδικεύοντάς** τις.
 
+Ας το δούμε και στην πράξη::
+
+    # Class Instances
+    my_dog = Dog()
+    my_cat = Cat()
+
+    my_dog.speak()
+    my_cat.speak()
+
+To αποτέλεσμα του παραπάνω κώδικα είναι::
+
+    Woof!
+    Meow!
+
+Φυσικά οι υποκλάσεις, εκτός από το να ξαναορίσουν τις μεθόδους που κληρονομούν,
+μπορούν να ορίσουν και νέες μεθόδους. Παράδειγμα δε θα δούμε για αυτό γιατί
+είναι μάλλον απλό.
+
+Απλή vs Πολλαπλή Κληρονομικότητα (Single vs Multiple Inheritance)
+-----------------------------------------------------------------
+
+Αργά ή γρήγορα (μάλλον γρήγορα) θα ακούσετε τον όρο *Πολλαπλή Κληρονομικότητα*
+(Multiple Inheritance). Η κληρονομικότητα που έχουμε δει έως τώρα είναι
+η λεγόμενη *Απλή Κληρονομικότητα* (Single Inheritance). Η διαφορά μεταξύ της
+απλής και της πολλαπλής κληρονομικότητας έγκειται στον αριθμό των υπερκλάσεων
+που έχει μία συγκεκριμένη υποκλάση. Αν κληρονομεί από μία μόνο υπερκλάση τότε
+μιλάμε για απλή κληρονομικότητα. Αν κληρονομεί από δύο ή περισσότερες
+υπερκλάσεις, τότε μιλάμε για πολλαπλή.
+
+Ένα παράδειγμα πολλαπλής κληρονομικότητας είναι το ακόλουθο::
+
+    class BaseClass1():
+        pass
+
+    class BaseClass2():
+        pass
+
+    class DerivedClass(BaseClass1, BaseClass2):
+        pass
+
+.. Warning::
+
+    Η πολλαπλή κληρονομικότητα είναι περίπλοκη. H χρήση της πολλαπλής
+    κληρονομικότητας είναι συνήθως ένδειξη κακού design.  Στην πλειοψηφία των
+    περιπτώσεων, υπάρχει απλούστερος τρόπος να κάνουμε αυτό που θέλουμε από το
+    να καταφύγουμε στην πολλαπλή κληρονομικότητα. Καλό είναι να την αποφεύγετε
+    (εκτός και αν ξέρετε τι κάνετε, οπότε μάλλον δε θα διαβάζετε αυτό το κείμενο
+    :P).
+
+Στο σημείο αυτό, οφείλουμε να διασαφηνίσουμε ότι μία αλληλουχία κλάσεων που
+διαδοχικά κληρονομούν η μία την άλλη **δεν** είναι πολλαπλή κληρονομικότητα.
+Παραδείγματος χάρη το ακόλουθο παράδειγμα είναι απολύτα τυπική απλή
+κληρονομικότητα::
+
+    class Animal():
+        pass
+
+    class Mamal(Animal):
+        pass
+
+    class Feline(Mamal):
+        pass
+
+    class Cat(Feline):
+        pass
+
+Θα μπορούσαμε φυσικά να έχουμε πολύ περισσότερες από τέσσερις κλάσεις. Τα
+γενεαλογικά δέντρα του ζωικού και του φυτικού βασιλείου αποτελούν πολύ
+χαρακτηριστικά παραδείγματα τέτοιου είδους αλληλουχιών.
+
+Πολλαπλή Κληρονομικότητα (Multiple Inheritance)
+-----------------------------------------------
+
+Απλά για λόγους πληρότητας πρέπει να αναφέρουμε και την *πολλαπλή
+κληρονομικότητα* (multiple inheritance). Πολλαπλή κληρονομικότητα σημαίνει μία
+υποκλάση να έχει πολλές υπερκλάσεις ταυτόχρονα. Παράδειγμα, δε θα παρουσιάσουμε
+εδώ καθώς η χρήση της καλό είναι να αποφεύγεται (εκτός και αν ξέρετε τι κάνετε
+:P).
 
 Σύνθεση (Composition)
 =====================