Ενότητα 7 - Τμήμα 1 - Κλάσεις

Ιστότοπος: ΕΛ/ΛΑΚ Moodle
Μάθημα: Εργαστήριο Python
Βιβλίο: Ενότητα 7 - Τμήμα 1 - Κλάσεις
Εκτυπώθηκε από: Guest user
Ημερομηνία: Δευτέρα, 6 Μαΐου 2024, 1:47 PM

Περιγραφή

Μετά την ολοκλήρωση αυτής της ενότητας οι φοιτητές θα μπορούν να:

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


7.1.1 - Τι είναι μία κλάση

Οι Κλάσεις και τα Αντικείμενα είναι πολύ χρήσιμα προγραμματιστικά εργαλεία που κάνουν τον προγραμματισμό ευκολότερο. 

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

Η Κλάση είναι μία δομή που περικλείει όλη την πληροφορία που χρειαζόμαστε για να καθορίσουμε τα χαρακτηριστικά ενός αντικειμένου.

shawn the sheep

Στην παραπάνω εικόνα το Ζώο είναι μία κλάση, Σκύλος και Πρόβατο είναι Αντικείμενα της κλάσης Ζώο.

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

7.1.2 - Δημιουργία μίας κλάσης

Για να δημιουργήσουμε μία κλάση πρέπει να την ορίσουμε, με τον ίδιο τρόπο όπως με μία συνάρτηση. Τα ονόματα των κλάσεων πάντα αρχίζουν με κεφαλαίο γράμμα αντίθετα με τις συναρτήσεις. Ενώ είναι δυνατό να αρχίζει το όνομα μίας κλάσης με μικρό γράμμα, δεν θεωρείτε καλή πρακτική.

Αντιγράψτε τον παρακάτω κώδικα στο Thonny και αποθηκεύστε το αρχείο σαν animals στον φάκελλο με τις εργασίες σας.

class Animal(): """ This is a class that represents animals in a game. """ def __init__(self): """ Set up the animals fields. """ self.name = "" self.type = "" self.color = "" self.legs = "" self.speed = ""

Στον παραπάνω κώδικα, Animal είναι το όνομα της κλάσης. Οι μεταβλητές name, type, color, legs και speed στην κλάση ονομάζονται χαρακτηριστικά ή πεδία.

Η def __init__(self)  είναι μία ειδική συνάρτηση που ονομάζεται κατασκευαστής (constructor) και τρέχει αυτόματα μόλις η κλάση δημιουργηθεί.

Το self. (τον εαυτό μου) είναι ένα είδος σαν την αντωνυμία δικό μου (my). Μέσα στην κλάση Animal μιλάμε για το δικό μου όνομα, δικό μου τύπο, χρώμα κλπ.

Προσθέστε των κώδικα που ακολουθεί μέσα στο πρόγραμμα που έχουμε γράψει στο Thonny μετά τη γραμμή 10 προσέχοντας τη στοίχιση της εσοχής.

# Create an animal shawn = Animal() #shawn's attributes shawn.name="Shawn" shawn.type="sheep" shawn.color="white" shawn.legs=4 shawn.speed=50 # Create another animal kitty = Animal() #kitty's attributes kitty.name="Kitty" kitty.type="cat" kitty.color="orange" kitty.legs=4 kitty.speed=24

Με τον παραπάνω κώδικα, μετά τη δημιουργία της κλάσης Animal, δημιουργήσαμε δύο ζώα - στιγμιότυπα της κλάσης animals, ένα πρόβατο και μία γάτα. Αυτά τα δύο στιγμιότυπα ονομάζονται Αντικείμενα. Ως ένα απλό ορισμό μπορούμε να πούμε ότι Αντικείμενο είναι ένα στιγμιότυπο μίας κλάσης.

Για να οπτικοποιήσετε την εκτέλεση αυτού του κώδικα πατήστε εδώ (www.pythontutor.com) 

animals class

class

7.1.4 - Μία κλάση για μία μπάλα

Αυτό το παράδειγμα κώδικα θα μπορούσε να χρησιμοποιηθεί στην Python/Pygame για να σχεδιάσει μία μπάλα. Η Τοποθέτηση όλων των παραμέτρων μέσα σε μία κλάση κάνει την διαχείριση δεδομένων ευκολότερη.

class Ball(): def __init__(self): # --- Class Attributes --- # Ball position self.x = 0 self.y = 0 # Ball's vector self.change_x = 0 self.change_y = 0 # Ball size self.size = 10 # Ball color self.color = [255,255,255] # --- Class Methods --- def move(self): self.x += self.change_x self.y += self.change_y def draw(self, screen): pygame.draw.circle(screen, self.color, [self.x, self.y], self.size )

Ο παρακάτω κώδικας πρέπει να μπει πάνω από την κύρια επανάληψη στο πρόγραμμα μας για να δημιουργήσει μία μπάλα και να ορίσει της ιδιότητες της:
theBall = Ball() theBall.x = 100 theBall.y = 100 theBall.change_x = 2 theBall.change_y = 1 theBall.color = [255,0,0]

Αυτός ο κώδικας πρέπει να μπει στην κύρια επανάληψη για να σχεδιάσει και να κινεί τη μπάλα:

theBall.move() theBall.draw(screen)

Μπορείτε να κάνετε λήψη του ολοκληρωμένου κώδικα από εδώ

7.1.5 - Αναφορές

Ρίξτε μια ματιά στον παρακάτω κώδικα.

class Person(): def __init__(self): self.name = "" self.money = 0 bob = Person() bob.name = "Bob" bob.money = 100 nancy = Person() nancy.name = "Nancy" print(bob.name, "has", bob.money, "euros.") print(nancy.name, "has", nancy.money, "dollars.")


Για να οπτικοποιήσετε τον κώδικα πατήστε στον σύνδεσμο για να μεταφερθείτε στο http://www.pythontutor.com

Ο Παραπάνω κώδικας δεν εμπεριέχει κάτι νέο, ο παρακάτω όμως έχει μία διαφορά:

class Person(): def __init__(self): self.name = "" self.money = 0 bob = Person() bob.name = "Bob" bob.money = 100 nancy = bob nancy.name = "Nancy" print(bob.name, "has", bob.money, "euros.") print(nancy.name, "has", nancy.money, "euros.")


Για να οπτικοποιήσετε τον κώδικα πατήστε στον σύνδεσμο για να μεταφερθείτε στο http://www.pythontutor.com

Η διαφορά στο pythontutor είναι στη γραμμά 10. Η nancy είναι μία αναφορά στο bob. Εκτός από αναφορά, μπορούμε να αποκαλέσουμε και διεύθυνση μνήμης , δείκτη, ή  χειρισμό. Μία αναφορά δείχνει σε μία διεύθυνση στη μνήμη του υπολογιστή στην οποία έχει αποθηκευτεί το αντικείμενο. Η διεύθυνση αυτή είναι ένας δεκαεξαδικός αριθμός, ο οποίος αν τυπωθεί μπορεί να είναι κάτι σαν 0x1e504. Όταν εκτελείτε ο κώδικας, γίνεται αντιγραφή της διεύθυνσης αντί να γίνει αντιγραφή του αντικειμένου που η διεύθυνση μνήμης περιέχει.

reference address

7.1.6 - Συναρτήσεις και αναφορές

Τώρα ας χρησιμοποιήσουμε μία αναφορά με μία συνάρτηση.

def give_money(person): person.money += 100 class Person(): def __init__(self): self.name = "" self.money = 0 bob = Person() bob.name = "Bob" bob.money = 100 give_money(bob) print(bob.money)


Και παρακολουθήστε το στο www.pythontutor.com

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

Άσκηση 1

Στην περιοχή εντολών του Thonny's δημιουργήστε ένα πρόγραμμα όπως στην περιγραφή που ακολουθεί:

  • Δημιουργήστε μία κλάση με όνομα Cat και ιδιότητες όνομα, χρώμα και βάρος (name, color, weight).
  • Δημιουργήστε μία μέθοδο μέσα στην κλάση με όνομα meow.
  • Δημιουργήστε ένα στιγμιότυπο της κλάσης cat, δώστε τιμές στις ιδιότητεςκαι καλέστε την μέθοδο meow.

Απάντηση άσκησης 1

Άσκηση 2

Στην περιοχή κώδικα του Thonny δημιουργήστε ένα πρόγραμμα όπως περιγράφεται παρακάτω:

  • Δημιουργήστε μία κλάση με όνομα Monster και με ιδιότητες, ένα όνομα και ένα ακέραιο αριθμό για υγεία (name, health).
  • Δημιουργήστε μία μέθοδο με όνομα decrease_health που δέχεται σαν παράμετρο ένα αριθμό και μειώνει την υγεία του αντικειμένου κατά τόσο.
  • Μέσα στην μέθοδο, να τυπώνεται το μήνυμα "το τέρας πέθανε" αν η υγεία του πάρει τιμή μικρότερη από το μηδέν.

Απάντηση άσκησης 2

7.1.7 - Κατασκευαστές

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

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

Κάντε μία ανασκόπηση του παρακάτω κώδικα (www.pythontutor.com)

class Dog(): def __init__(self, new_name): """ Constructor. """ self.name = new_name print("A new dog is born. It's name is " + new_name + ".") my_dog=Dog("Spot")


Η συνάρτηση init σε αυτόν τον κώδικα έχει μία επιπλέον παράμετρο εκτός από το self. Αυτή είναι η self.name του νεόυ αντικειμένου. Επίσης μέσα στην init μπορούμε να τυπώσουμε ένα μήνυμα για να ενημερώσουμε για το νέο αντικείμενο.

Αντιγράψτε τον κώδικα  που δημιουργεί την κλάση στο Thonny και αποθηκεύτο το αρχείο ως classConstructor.

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

>>> my_dog = Dog("Pythos")

>>> my_dog = Dog()