Python

ΕΝΟΤΗΤΑ 20 - Classes (Part 1)

image description

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

Ας θεωρήσουμε ότι μας έχουν αναθέσει να γράψουμε ένα πρόγραμμα μέσα από το οποίο κρατάμε πληροφορίες για τους εργαζόμενους μιας εταιρείας. Αυτό που πρέπει να κάνουμε σαν πρώτο βήμα είναι να αναρωτηθούμε ποιο είναι το αντικείμενο που μας ενδιαφέρει να δημιουργήσουμε σε αυτό το πρόβλημα. Η απάντηση είναι απλή – ο εργαζόμενος. Βασικά, κάθε ουσιαστικό όνομα, όπως εργαζόμενος, αμάξι, τιμολόγιο κτλ, είναι αυτό που στην πραγματικότητα μας ενδιαφέρουν. Οπότε, πως μπορούμε να αντιπροσωπεύσουμε ένα φυσικό αντικείμενο προγραμματιστικά? Με μια κλάση! Αυτός μπορεί να θεωρηθεί και ο γενικός μας κανόνας: μια κλάση είναι η προγραμματιστική αντιπροσώπευση ενός αντικειμένου. Με την ίδια λογική αν μας είχαν αναθέσει να δημιουργήσουμε ένα πρόγραμμα για ένα εργοστάσιο που κατασκευάζει αμάξια, τότε ένα από τα αντικείμενα που θα έπρεπε να αντιπροσωπεύσουμε προγραμματιστικά με μια κλάση θα ήταν το αυτοκίνητο. Με αυτό τον ορισμό, όσο και απλός και αν ακούγεται, δεν πρόκειται να κάνετε ποτέ λάθος στην δημιουργία προγραμμάτων.

Ωραία, οπότε για να αντιπροσωπεύσουμε τον εργαζόμενο για τον οποίο ξεκινήσαμε να μιλάμε, χρειάζεται να δημιουργήσουμε μια κλάση. Αλλά πως δημιουργούμε κλάσεις στην Python? Η πιο απλή μορφή κλάσης στην Python είναι η εξής:

App.py


class Employee():
    pass
   

Μπορεί να μην το πιστεύετε αλλά μόλις δημιουργήσατε το πρώτο σας object-oriented πρόγραμμα. Ο ορισμός μιας κλάσης ξεκινάει από την λέξη κλειδί class. Αμέσως μετά ακολουθεί το όνομα της κλάσης και μετά το σύμβολο colon ( : ). Όπως και στα functions έτσι και στις κλάσεις πρέπει ο κώδικας που περιέχουν να είναι indented. Στο δικό μας παράδειγμα δεν έχουμε γράψει ακόμα κάποιο κώδικα, αλλά έχουμε δηλώσει την λέξη κλειδί pass που σύντομα θα αντικατασταθεί με κώδικα. Για τώρα, η pass απλά δηλώνει στον compiler της Python ότι η λέξη είναι ολοκληρωμένη οπότε δεν θα δημιουργηθούν exceptions όταν την χρησιμοποιήσουμε.

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

App.py


class Employee():
    pass

mike = Employee()
george = Employee()

print(mike)
print(george)

   

Output


<__main__.Employee object at 0x0000016CBAE3FFD0>
<__main__.Employee object at 0x0000016CBAE3FFA0>
		
 	 

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

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

Στο δικό μας παράδειγμα, θέλουμε να δημιουργήσουμε αντικείμενα που να μπορούμε να ορίζουμε το όνομα του εργαζόμενου, αλλά και τον αριθμό εργασίας που έχει μέσα στην εταιρεία. Για να το πετύχουμε αυτό, θα ορίσουμε δύο μεταβλητές μέσα στην κλάση. Αφού δημιουργήσουμε το αντικείμενο αν γράψουμε τελεία ( . ) αμέσως μετά το όνομα του αντικειμένου θα δούμε όλες τις μεταβλητές που έχει σαν χαρακτηριστικά. Επειδή οι μεταβλητές αρχικά δεν έχουν τιμές, ορίζουμε το όνομα στο πρώτο αντικείμενο να είναι 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


Michail
Giorgios
	
 	 

Έχουμε καταφέρει ήδη πάρα πολλά. Δημιουργήσαμε αντικείμενα και δώσαμε τιμές στα attributes που έχουν.

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

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


Michail 100
Giorgos 101
 	 

Όπως βλέπετε αρκετά πράγματα άλλαξαν στον κώδικα μας, οπότε πάμε να τα δούμε όλα με την σειρά. Καλούμε λοιπόν την μέθοδο init για να μπορέσουμε να δημιουργήσουμε αντικείμενα με αρχικές τιμές. Οι διπλές κάτω παύλες πριν και μετά το όνομα της μεθόδου δηλώνουν ότι η συγκεκριμένη μέθοδο προσφέρεται από την Python και έχει ειδικό σκοπό και ρόλο ο οποίος είναι, αμέσως μετά την δημιουργία του αντικειμένου, να αναθέσει τιμές στις μεταβλητές του.

Στην παρένθεση της init υπάρχουν τρεις παράμετροι – η shelf, το name και το id. Το name και το id είναι οι δύο τιμές που ζητάμε να μας δοθούν για να τις αναθέσουμε στο αντικείμενο όταν δημιουργηθεί. Η λέξη shelf αναφέρεται στο αντικείμενο που έχει δημιουργηθεί και χρησιμοποιείται για να αποκτήσουμε πρόσβαση στις μεταβλητές του αντικειμένου και κατά συνέπεια να αναθέσουμε αρχικές τιμές σε αυτές.

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

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


Michail 100
Giorgos 0
	
 	 

Πριν κλείσουμε το σημερινό δωρεάν μάθημα Python θα ήθελα να αναφερθώ σε δύο έννοιες που ήδη έχετε χρησιμοποιήσει χωρίς ίσως να το έχετε καταλάβει: global variables και instance variables. Μια μεταβλητή που ορίζεται σε επίπεδο κλάσης (όχι μέσα στην init) θεωρείται global variable γιατί μπορούν όλες οι μέθοδοι αλλά και τα αντικείμενα να έχουν πρόσβαση σε αυτήν. Μια όμως μεταβλητή που ορίζεται μέσα στην init μέθοδο θεωρείται instance variable και σε αυτήν μόνο έχει πρόσβαση το αντικείμενο.

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

Μιχάλης Κασάπογλου

Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.

loader