PYTHON ΜΑΘΗΜΑ 22 – Classes (Part 1)

 

Δωρεάν Μαθήματα Python

ΕΙΣΑΓΩΓΗ

Στο σημερινό δωρεάν μάθημα Python ξεκινάμε το ταξίδι μας στον συναρπαστικό κόσμο του OOP (Object-Oriented Programming - Αντικειμενοστρεφής Προγραμματισμός). Αρχικά, θα αναλύσουμε τον κρίσιμο ρόλο που παίζουν οι κλάσεις (classes) σε ένα πρόγραμμα. Στη συνέχεια, θα περάσουμε στην πράξη: θα γράψουμε την πρώτη μας κλάση στην Python και μέσα από αυτήν θα δώσουμε ζωή στο πρώτο μας αντικείμενο (object).

THE EMPLOYEE CLASS

Ας υποθέσουμε ότι μας έχουν αναθέσει να γράψουμε ένα πρόγραμμα μέσω του οποίου θα διαχειριζόμαστε πληροφορίες για τους εργαζόμενους μιας εταιρείας. Το πρώτο βήμα που πρέπει να κάνουμε είναι να αναρωτηθούμε: ποιο είναι το βασικό αντικείμενο (ή η οντότητα) που μας ενδιαφέρει σε αυτό το πρόβλημα; Η απάντηση είναι απλή – ο εργαζόμενος.

Ουσιαστικά, κάθε ουσιαστικό, όπως «εργαζόμενος», «αυτοκίνητο», «τιμολόγιο» κ.λπ., είναι συνήθως αυτό που μας ενδιαφέρει να αποτυπώσουμε στον κώδικά μας. Πώς μπορούμε, λοιπόν, να αντιπροσωπεύσουμε ένα φυσικό αντικείμενο προγραμματιστικά; Με μια κλάση (class)!

Αυτός μπορεί να θεωρηθεί και ο γενικός μας κανόνας: μια κλάση είναι η προγραμματιστική αντιπροσώπευση ενός πραγματικού αντικειμένου (ή μιας έννοιας).

Με την ίδια λογική, αν μας είχαν αναθέσει να δημιουργήσουμε ένα πρόγραμμα για ένα εργοστάσιο παραγωγής οχημάτων, ένα από τα αντικείμενα που θα έπρεπε να αντιπροσωπεύσουμε με μια κλάση θα ήταν το «Αυτοκίνητο». Έχοντας αυτόν τον κανόνα στο μυαλό σας, όσο απλός κι αν ακούγεται, δεν πρόκειται να χάσετε ποτέ τον προσανατολισμό σας κατά τον σχεδιασμό των προγραμμάτων σας.

Ωραία! Επομένως, για να αντιπροσωπεύσουμε και να περιγράψουμε προγραμματιστικά τον εργαζόμενο για τον οποίο ξεκινήσαμε να μιλάμε, χρειάζεται να δημιουργήσουμε μια κλάση. Αλλά πώς δημιουργούμε κλάσεις στην Python;

Η πιο απλή μορφή μιας κλάσης στην Python είναι η εξής:

app.py

class Employee():
    pass

Μπορεί να μην το πιστεύετε, αλλά μόλις δημιουργήσατε το πρώτο σας object-oriented πρόγραμμα!

Ο ορισμός μιας κλάσης ξεκινάει πάντα με τη λέξη-κλειδί class. Αμέσως μετά ακολουθεί το όνομα της κλάσης (συχνά συνοδευόμενο από παρενθέσεις) και τέλος το σύμβολο της άνω και κάτω τελείας (:). Όπως ακριβώς συμβαίνει με τις συναρτήσεις (functions), έτσι και στις κλάσεις, ο κώδικας που ανήκει σε αυτές πρέπει να έχει τις κατάλληλες εσοχές (indentation).

Στο δικό μας παράδειγμα δεν έχουμε προσθέσει ακόμα λογική, αλλά έχουμε δηλώσει τη λέξη-κλειδί pass, η οποία σύντομα θα αντικατασταθεί με πραγματικό κώδικα. Προς το παρόν, η pass λειτουργεί ως σύμβολο κράτησης θέσης (placeholder). Ουσιαστικά, λέει στον διερμηνέα (interpreter) της Python ότι η σύνταξη της κλάσης είναι ολοκληρωμένη, ώστε να μην προκύψουν σφάλματα (exceptions) όταν εκτελεστεί το πρόγραμμα.

Αν και η κλάση Employee που φτιάξαμε δεν περιέχει απολύτως τίποτα, έχει ήδη τη δυνατότητα να παράγει αντικείμενα. Για να δημιουργήσουμε ένα αντικείμενο, το μόνο που έχουμε να κάνουμε είναι να "καλέσουμε" το όνομα της κλάσης ακολουθούμενο από παρενθέσεις. Τέλος, το αποτέλεσμα αυτής της κλήσης το αναθέτουμε σε μια καινούργια μεταβλητή.

app.py

class Employee():
    pass


mike = Employee()
george = Employee()

print(mike)
print(george)

Output

Δωρεάν Μαθήματα Python

 

Τα ονόματα mike και george (οι μεταβλητές μας) αντιπροσωπεύουν δύο διαφορετικά αντικείμενα που μόλις δημιουργήσαμε από την κλάση Employee. Το αποτέλεσμα που μας επιστρέφει η συνάρτηση print() είναι η θέση στη μνήμη του υπολογιστή που έχει δεσμευτεί για το κάθε αντικείμενο. Ίσως αυτή η πληροφορία να σας φαίνεται άχρηστη προς το παρόν, όμως μας αποδεικνύει κάτι πολύ σημαντικό: τα αντικείμενά μας δημιουργήθηκαν με επιτυχία!

Μέσα στην κλάση, για να μπορέσουμε να περιγράψουμε πλήρως ένα αντικείμενο, χρησιμοποιούμε δύο βασικά δομικά στοιχεία:

  • Ιδιότητες (Attributes): Είναι οι μεταβλητές που περιγράφουν τα χαρακτηριστικά του αντικειμένου (π.χ. το χρώμα του, το όνομά του, το μέγεθός του).
  •  Μέθοδοι (Methods): Είναι ουσιαστικά συναρτήσεις (functions) που ανήκουν στην κλάση και δίνουν στο αντικείμενο την ικανότητα να κάνει κάτι (π.χ. να υπολογίσει, να κινηθεί, να στείλει ένα μήνυμα).

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

Αφού δημιουργήσουμε το αντικείμενο, αν πληκτρολογήσουμε μια τελεία (.) αμέσως μετά το όνομά του, αποκτούμε πρόσβαση σε όλες τις μεταβλητές που έχει ως χαρακτηριστικά. Επειδή αυτές οι μεταβλητές αρχικά δεν έχουν τιμές, αναθέτουμε στο πρώτο αντικείμενο το όνομα 'Michail' και στο δεύτερο 'Giorgos'. Στη συνέχεια, ζητάμε να τα τυπώσουμε στην οθόνη χρησιμοποιώντας την ίδια ακριβώς σύνταξη: αντικείμενο.μεταβλητή.

app.py

class Employee():
    name = ""
    id = 0


mike = Employee()
mike.name = "Michail"
print(mike.name)

george = Employee()
george.name = "Giorgios"
print(george.name)

Output

Δωρεάν Μαθήματα Python

 

 __init__ METHOD

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

Τώρα θέλουμε να κάνουμε το επόμενο βήμα και να γίνουμε πιο "αυστηροί": θέλουμε να απαγορεύσουμε τη δημιουργία αντικειμένων χωρίς αρχικές τιμές. Με άλλα λόγια, την ίδια ακριβώς στιγμή που δημιουργούμε το αντικείμενο, θέλουμε να είναι υποχρεωτικό να του περνάμε και τις τιμές για τα attributes του. Αν παραλείψουμε αυτές τις τιμές, η Python δεν θα μας επιτρέπει να δημιουργήσουμε το αντικείμενο.

Για να μπορέσει η Python να μας επιβάλει αυτόν τον κανόνα, θα πρέπει να ορίσουμε τα attributes μέσα σε μια ειδική μέθοδο (method) που ονομάζεται __init__ (έχει δύο κάτω παύλες, underscores, στην αρχή και δύο στο τέλος).

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

app.py

class Employee():

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


mike = Employee("Michail", 100)
print(mike.name, mike.id)

george = Employee("Giorgos", 101)
print(george.name, george.id)

Output

Δωρεάν Μαθήματα Python

 

Όπως βλέπετε, αρκετά πράγματα άλλαξαν στον κώδικά μας, οπότε πάμε να τα δούμε όλα με τη σειρά.

Ορίζουμε, λοιπόν, την ειδική μέθοδο __init__ για να μπορέσουμε να δημιουργήσουμε αντικείμενα με αρχικές τιμές. Οι διπλές κάτω παύλες (underscores) πριν και μετά το όνομα της μεθόδου δηλώνουν ότι πρόκειται για μια ενσωματωμένη "μαγική" (magic/dunder) μέθοδο της Python. Ο ειδικός της σκοπός και ρόλος είναι ο εξής: εκτελείται αυτόματα αμέσως μετά τη δημιουργία του αντικειμένου, προκειμένου να αναθέσει (αρχικοποιήσει) τις τιμές στις μεταβλητές του.

Στην παρένθεση της __init__ υπάρχουν τρεις παράμετροι: η self, το name και το id.

Το name και το id είναι οι δύο τιμές που ζητάμε να μας δοθούν (από τον χρήστη ή το υπόλοιπο πρόγραμμα) για να τις αναθέσουμε στο αντικείμενο τη στιγμή που αυτό δημιουργείται.

Η λέξη self είναι ίσως η πιο σημαντική εδώ: αναφέρεται στο ίδιο το αντικείμενο που πρόκειται να δημιουργηθεί (στον "εαυτό" του). Τη χρησιμοποιούμε για να αποκτήσουμε πρόσβαση στις μεταβλητές του συγκεκριμένου αντικειμένου και, κατά συνέπεια, να "καρφιτσώσουμε" τις αρχικές τιμές πάνω του.

Όπως είναι γραμμένος τώρα ο κώδικας στο παράδειγμά μας, μπορούμε να δημιουργήσουμε αντικείμενα μόνο εάν εισάγουμε και τις δύο τιμές (name και id) κατά τη δήλωση δημιουργίας του αντικειμένου.

Αν επιθυμούσαμε να προσφέρουμε και άλλες επιλογές —όπως, για παράδειγμα, να δημιουργήσουμε ένα αντικείμενο εισάγοντας μόνο την τιμή για το όνομα— τότε θα έπρεπε να δηλώσουμε προκαθορισμένες τιμές (default values) στις παραμέτρους μέσα στην παρένθεση της __init__. Έτσι, αν εμείς παραλείψουμε να εισάγουμε κάποια τιμή, η Python θα χρησιμοποιήσει αυτόματα την προκαθορισμένη τιμή που έχουμε ορίσει.

app.py

class Employee():

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


mike = Employee("Michail", 100)
print(mike.name, mike.id)

george = Employee("Giorgos")
print(george.name, george.id)


Output

Δωρεάν Μαθήματα Python

 

Πριν κλείσουμε το σημερινό δωρεάν μάθημα Python, θα ήθελα να αναφερθώ σε δύο πολύ σημαντικές έννοιες, τις οποίες ίσως ήδη χρησιμοποιήσατε χωρίς καν να το καταλάβετε: τις Class Variables (Μεταβλητές Κλάσης) και τις Instance Variables (Μεταβλητές Στιγμιότυπου/Αντικειμένου).

  • Class Variables: Μια μεταβλητή που ορίζεται στο επίπεδο της κλάσης (δηλαδή έξω από την __init__ και οποιαδήποτε άλλη μέθοδο) ονομάζεται μεταβλητή κλάσης. Το βασικό της χαρακτηριστικό είναι ότι μοιράζεται σε όλα τα αντικείμενα. Όλες οι μέθοδοι, καθώς και όλα τα αντικείμενα που θα δημιουργηθούν από αυτή την κλάση, έχουν πρόσβαση στην ίδια ακριβώς μεταβλητή.

  • Instance Variables: Αντίθετα, μια μεταβλητή που ορίζεται μέσα στη μέθοδο __init__ (χρησιμοποιώντας το self) αποτελεί αποκλειστική ιδιοκτησία του συγκεκριμένου αντικειμένου. Μόνο το ίδιο το αντικείμενο έχει πρόσβαση σε αυτήν και μπορεί να της δώσει τη δική του, μοναδική τιμή.


Στηρίξτε την προσπάθειά μας! Εάν βρήκατε αυτό το μάθημα χρήσιμο και θέλετε να στηρίξετε το groundofcode.blogspot.com, μπορείτε να κάνετε ένα μικρό donation (δωρεά). Η υποστήριξή σας μας δίνει τη δύναμη να μεγαλώσουμε ακόμα περισσότερο, να αναβαθμίσουμε τις υποδομές μας και να συνεχίσουμε να προσφέρουμε ποιοτικά, δωρεάν μαθήματα προγραμματισμού σε όλους!

full-width

Post a Comment

0 Comments