6 η Διάλεξη Python Κλάσεις & Αντικείμενα

Σχετικά έγγραφα
ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Κλάσεις και αντικείμενα #include <iostream.h<

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Κλάσεις στην Python. Δημιουργία κλάσεων

Αντικειμενοστρεφής προγραμματισμός Object Oriented Programming (OOP) Σπάχος Κυριάκος Καθηγητής Πληροφορικής ΠΕ19

Εισαγωγή στον Προγ/μό Υπολογιστών

Γραφικά υπολογιστών Εργαστήριο 9 Κλάσεις στην Python. Σκοπός της 9ης άσκησης είναι να μάθουμε αντικειμενοστρεφή προγραμματισμό στην Python.

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Κλάσεις στην Python. Δημιουργία κλάσεων

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Αντικειμενοστραφής Προγραμματισμός

2.1 Αντικειµενοστρεφής προγραµµατισµός

Σύνθεση και Κληρονομικότητα

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ) ΚΑΙ ΜΑΘΗΜΑΤΩΝ ΕΙΔΙΚΟΤΗΤΑΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ (ΟΜΑΔΑ Α ΚΑΙ Β ) ΤΕΤΑΡΤΗ 20 ΙΟΥΝΙΟΥ 2018

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

Σύνθεση και Κληρονομικότητα

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Στοιχειώδης προγραμματισμός σε C++

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

ΚΕΦΑΛΑΙΟ 8. Κλάσεις και αντικείμενα. 8.1 Εισαγωγή

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ

Γλωσσική Τεχνολογία. Object-Orientation in Python

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Με τι ασχολείται ο αντικειμενοστραφής προγραμματισμός

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματιστικά Εργαλεία και Τεχνολογίες για Επιστήμη Δεδομένων

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2019 Β ΦΑΣΗ

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Αντικειμενοστρεφής Προγραμματισμός

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Εισαγωγή στον Προγραμματισμό

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

(Διαφάνειες Νίκου Βιδάκη)

ΣΥΝΟΛΟ ΣΕΛΙ ΩΝ: ΕΠΤΑ (7)

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγράμματα με δομή Κληρονομικότητας

Δομημένος Προγραμματισμός

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Κλάσεις και Αντικείµενα

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης

Προγραμματισμός ΙI (Θ)

3 Αλληλεπίδραση Αντικειμένων

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Εισαγωγή στην επιστήμη των υπολογιστών

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

Pascal. 15 Νοεμβρίου 2011

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

Διαγράμματα Κλάσεων στη Σχεδίαση

Προγραμματισμός ΙI (Θ)

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

επιµέλεια Θοδωρής Πιερράτος

Εισαγωγή στον Προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Ανακτήθηκε από την ΕΚΠΑΙΔΕΥΤΙΚΗ ΚΛΙΜΑΚΑ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

Διαδικασιακός Προγραμματισμός

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Εισαγωγή στον Προγραμματισμό

Υπερφόρτωση τελεστών

Εργαστήριο 6 ο 7 ο / Ερωτήματα Ι

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Διαδικασιακός Προγραμματισμός

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Εισαγωγή στα Αντικείμενα

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Ειδικά Θέματα Προγραμματισμού

Εισαγωγή στον Προγραμματισμό Python Μάθημα 4: Συναρτήσεις (functions) και δομοστοιχεία (modules) στην Python

ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Τυπικές χρήσεις της Matlab

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης

Εισαγωγή στον Προγ/μό Υπολογιστών

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Γ ΤΑΞΗΣ ΗΜΕΡΗΣΙΩΝ & Δ ΤΑΞΗΣ ΕΣΠΕΡΙΝΩΝ ΥΠΟΛΕΙΠΟΜΕΝΕΣ ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ HMEΡΗΣΙΩΝ ΚΑΙ ΕΣΠΕΡΙΝΩΝ ΕΠΑΓΓΕΛΜΑΤΙΚΩΝ ΛΥΚΕΙΩΝ

Συναρτήσεις στη Visual Basic 6.0

Φυσικές και τεχνητές γλώσσες. Το αλφάβητο της ΓΛΩΣΣΑΣ, Τύποι Δεδομένων. Σταθερές, Μεταβλητές, Τελεστές, Συναρτήσεις, Δομή Προγράμματος

Διαδικασιακός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

Εισαγωγή στον Προγραμματισμό

Transcript:

6 η Διάλεξη Python Κλάσεις & Αντικείμενα

Αντικειμενοστραφής προγραμματισμός Όλα τα προγράμματα που γράψαμε μέχρι στιγμής, τα σχεδιάσαμε με τη χρήση συναρτήσεων, δηλαδή μπλοκ εντολών που χειρίζονται δεδομένα. Αυτή η μέθοδος αποκαλείται διαδικασιοστρεφής προγραμματισμός Υπάρχει και άλλη μέθοδος συγγραφής προγραμμάτων, η οποία συνδυάζει δεδομένα και λειτουργικότητα εμπερικλείοντας τα σε ένα αντικείμενο. Οι κλάσεις και τα αντικείμενα είναι οι δύο κύριες πτυχές του αντικειμενοστραφούς προγραμματισμού. Μια κλάση δημιουργεί ένα νέο τύπο, όπου τα αντικείμενα είναι υποστάσεις (instances) της κλάσης. Μια αναλογία θα ήταν με μεταβλητές του τύπου int και μεταφράζεται αντίστοιχα λέγοντας ότι οι μεταβλητές που αποθηκεύουν ακέραιους αριθμούς είναι υποστάσεις (αντικείμενα) της κλάσης int

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

Αντικειμενοστραφής προγραμματισμός Τα πεδία είναι δύο τύπων -μπορεί να ανήκουν στην υπόσταση/αντικείμενο της κλάσης ή στην ίδια την κλάση. Αποκαλούνται μεταβλητές υπόστασης (instance variables) και μεταβλητές κλάσης αντίστοιχα. Μια κλάση δημιουργείται με τη λέξη-κλειδί class. Τα πεδία και οι μέθοδοι της κλάσης απαριθμούνται σε μια πλοκάδα κώδικα σε εσοχή. Οι μέθοδοι κλάσης έχουν μια συγκεκριμένη διαφορά από τις κοινές συναρτήσεις - πρέπει να έχουν ένα επιπλέον όνομα και πρέπει να προστεθεί στην αρχή της λίστας παραμέτρων, εσείς δε χρειάζεται να ορίσετε μια τιμή σε αυτή την παράμετρο όταν καλείτε τη μέθοδο, σας το παρέχει η Python. Αυτή η συγκεκριμένη μεταβλητή αναφέρεται στο ίδιο το αντικείμενο και κατά συνθήκη, της αποδίδεται το όνομα self.

Αντικειμενοστραφής προγραμματισμός Παρόλο που μπορείτε να δώσετε οποιοδήποτε όνομα σε αυτή την παράμετρο, συνιστάται το όνομα μεταβλητής self -οποιοδήποτε άλλο όνομα είναι απαξιωτικό. Υπάρχουν πολλά πλεονεκτήματα για τη χρήση ενός πρότυπου ονόματος μεταβλητής -ο κάθε αναγνώστης του κώδικα του προγράμματος σας θα το αναγνωρίσει άμεσα. Ακόμη και γραφικά περιβάλλοντα ανάπτυξης λογισμικού (Integrated Development Environments) θα σας συνδράμουν, αν χρησιμοποιείτε το όνομα μεταβλητής self Θα αναρωτιέστε πώς η Python ορίζει την τιμή για τη self και γιατί σας απαλλάσσει από τον χειροκίνητο ορισμό της. Παράδειγμα: Έστω μια κλάση MyClass και μια υπόσταση αυτής myobject. Αν καλέσετε μια μέθοδο αυτού του αντικειμένου myobject.method(arg1, arg2), μετατρέπεται αυτόματα από την Python σε MyClass.method(myobject, arg1, arg2) -αυτή είναι και η ιδιαιτερότητα του ονόματος μεταβλητής self. Αυτό σημαίνει επίσης ότι εάν έχετε μια μέθοδο η οποία δεν λαμβάνει ορίσματα, τότε θα πρέπει να έχει τουλάχιστον ένα όρισμα, τη μεταβλητή self.

Κλάσεις Η απλούστερη κλάση φαίνεται στο παρακάτω παράδειγμα. #!/usr/bin/python # Filename: simplestclass.py class Person: pass # Ένα κενό μπλοκ p = Person() print(p) Συνηθίζεται ο πρώτος χαρακτήρας του ονόματος μιας κλάσης να αναγράφεται με κεφαλαία.

Κλάσεις Στο παραπάνω πρόγραμμα δημιουργούμε 2 αντικείμενα της κλάσης Point. H εκτύπωση ενός αντικειμένου μας πληροφορεί για την κλάση του και τη διεύθυνση μνήμης που καταλαμβάνει

Κλάσεις Η προσθήκη χαρακτηριστικών σε ένα αντικείμενο μπορεί να γίνει δυναμικά όποτε αυτό είναι απαραίτητο χρησιμοποιώντας το συμβολισμό object.attribute=value:

Μέθοδοι αντικειμένου class Person: def sayhi(self): print('hello, how are you?' ) p = Person() p.sayhi() # Αυτό το σύντομο παράδειγμα θα μπορούσε να γραφτεί και ως Person().sayHi() Εδώ βλέπουμε τη μεταβλητή self σε δράση. Παρατηρήστε πως η μέθοδος sayhi δε δέχεται παραμέτρους, αλλά εμπερικλείει τη μεταβλητή self στον ορισμό της συνάρτησης.

Η μέθοδος init Υπάρχουν πολλά ονόματα μεθόδων που έχουν ειδική σημασία στις κλάσεις Python. Η μέθοδος init εκτελείται μόλις ένα αντικείμενο μιας κλάσης αρχικοποιείται. Η μέθοδος αυτή είναι χρήσιμη για την κατάλληλη αρχικοποίηση που επιθυμείτε για το αντικείμενο σας. Παράδειγμα: #!/usr/bin/python # Filename: class_init.py class Person: def init (self, name): self. name = name def sayhi(self): print('hello, my name is', self. name) p = Person('Swaroop' ) p. sayhi() # Αυτό το σύντομο παράδειγμα μπορεί να γραφτεί και ως Person('Swaroop' ). sayhi() Η μέθοδος init λαμβάνει ως παράμετρο την name (μαζί με self). Δημιουργούμε ένα νέο πεδίο που αποκαλείται επίσης name. Προσέξτε ότι πρόκειται για δύο διαφορετικές μεταβλητές παρότι αναφέρονται και οι δύο ως 'name'. Δεν πρόκειται να υπάρξει σύγχυση εδώ διότι ο διάστικτος συμβολισμός (dotted notation) self.name σημαίνει ότι υπάρχει μεταβλητή που λέγεται "name" και είναι μέρος του αντικειμένου που λέγεται "self" ενώ το άλλο name είναι μια τοπική μεταβλητή. Δεν καλούμε ρητά τη μέθοδο init, αλλά μεταφέρουμε τα ορίσματα εντός των παρενθέσεων μετά το όνομα της κλάσης, όταν δημιουργούμε μια νέα υπόσταση της κλάσης.

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

Κλάσεις - Παραδείγματα Η κληση μιας μεθόδου γίνεται με τη χρήση του συμβολισμού της τελείας Object.method() Εκτός από χαρακτηριστικά των αντικειμένων υπάρχουν και τα χαρακτηριστικά κλάσεων. Πρόσβαση σε αυτά έχουμε ως εξής: class.attribute

Κλάσεις - Παραδείγματα Η προσθήκη ενός κλειδιού στη λίστα data θα γίνει 3 φορές, όση είναι η τιμή της μεταβλητής limit.στη συνέχεια αλλάζουμε την τιμή της μεταβλητής limit σε 4 για να προσθέσουμε 4 κωδικούς

Μεταβλητές κλάσης και αντικειμένου Τα δεδομένα, δηλαδή τα πεδία, δεν είναι παρά συνηθισμένες μεταβλητές και οροθετούνται από τους χώρους ονομάτων (namespaces) των κλάσεων και αντικειμένων. Αυτό σημαίνει πρακτικά ότι τα ονόματα αυτά είναι έγκυρα μόνο εντός αυτών των κλάσεων και αντικειμένων. Γι' αυτό αποκαλούνται name Spaces. Υπάρχουν δύο τύποι πεδίων (fields) -μεταβλητές κλάσης και μεταβλητές αντικειμένων και οι οποίες ταξινομούνται ανάλογα με την κλάση ή αντικείμενο που τις κατέχει αντίστοιχα. Οι Μεταβλητές κλάσης είναι κοινόχρηστες -μπορούν να προσπελαστούν από όλες τις υποστάσεις αυτής της κλάσης. Υπάρχει μόνο ένα αντίγραφο της μεταβλητής κλάσης και όταν κάποιο αντικείμενο τροποποιήσει τη μεταβλητή αυτή, η τροποποίηση θα είναι εμφανής σε όλες τις υποστάσεις. Οι μεταβλητές αντικειμένου ανήκουν μεμονωμένα σε κάθε αντικείμενο/υπόσταση της κλάσης. Στην περίπτωση αυτή, κάθε αντικείμενο έχει το δικό του αντίγραφο του πεδίου, δηλαδή δεν είναι κοινόχρηστες και δεν σχετίζονται σε καμία περίπτωση με το συνονόματο πεδίο σε μια διαφορετική υπόσταση.

Μεταβλητές κλάσης και αντικειμένου

Μεταβλητές κλάσης και αντικειμένου droid1 = Robot('R2-D2' ) droid1. sayhi() Robot. howmany() droid2 = Robot('C-3PO' ) droid2. sayhi() Robot. howmany() print("\nrobots can do some work here. \n") print("robots have finished their work. So let's destroy them.") del droid1 del droid2 Αν δώσουμε της παραπάνω εντολές θα πάρουμε ως έξοδο: (Initializing R2-D2) Greetings, my masters call me R2-D2. We have 1 robots. (Initializing C-3PO) Greetings, my masters call me C-3PO. We have 2 robots. Robots can do some work here. Robots have finished their work. So let's destroy them.

Μεταβλητές κλάσης και αντικειμένου R2-D2 is being destroyed! There are still 1 robots working. C-3PO is being destroyed! C-3PO was the last one. We have 0 robots. Η μεταβλητή population ανήκει στην κλάση Robot και συνεπώς είναι μια μεταβλητή κλάσης. Η μεταβλητή name ανήκει στο αντικείμενο (έχει ανατεθεί με τη χρήση της self) και είναι μια μεταβλητή αντικειμένου. Άρα, αναφερόμαστε στη μεταβλητή κλάσης population ως Robot.population και όχι ως self.population. Αναφερόμαστε στη μεταβλητή αντικειμένου name με το συμβολισμό self.name των μεθόδων αυτού του αντικειμένου. Να θυμάστε αυτή την απλή διαφορά μεταξύ των μεταβλητών κλάσεων και αντικειμένων. Σημειώστε επίσης ότι μια μεταβλητή αντικειμένου με το ίδιο όνομα μιας μεταβλητής κλάσης θα αποκρύψει τη μεταβλητή κλάσης!

Μεταβλητές κλάσης και αντικειμένου Το πεδίο howmany είναι πράγματι μια μέθοδος που ανήκει στην κλάση και όχι στο αντικείμενο. Αυτό σημαίνει ότι μπορούμε να οριστεί είτε ως classmethod ή ως staticmethod, ανάλογα με το αν θα πρέπει να γνωρίζουμε σε ποια κλάση ανήκει. Δεδομένου ότι δε χρειαζόμαστε τέτοιες πληροφορίες, θα επιλέξουμε τη staticmethod. Θα είχαμε επίσης το ίδιο αποτέλεσμα με τη χρήση διακοσμητών (decorators) @staticmethod def howmany(): '''Prints the current population.''' print('we have {0:d} robots.'. format(robot. population)) Μπορούμε να φανταστούμε τους διακοσμητές ως συντομεύσεις για την κλήση μιας ρητής εντολής (explicit statement), όπως είδαμε σε αυτό το παράδειγμα. Παρατηρήστε ότι η μέθοδος init χρησιμοποιείται για την αρχικοποίηση της υπόστασης Robot με ένα όνομα. Σε αυτή τη μέθοδο, ο αριθμός του πληθυσμού population αυξάνεται κατά 1, προσθέτοντας ένα ακόμη ρομπότ. Παρατηρήστε επίσης ότι οι τιμές της κλάσης self.name είναι ειδικές για κάθε αντικείμενο, γεγονός που υποδεικνύει τη φύση των μεταβλητών αντικειμένου.

Μεταβλητές κλάσης και αντικειμένου Θυμηθείτε ότι οφείλετε να αναφέρεστε στις μεταβλητές και μεθόδους του ιδίου αντικειμένου αποκλειστικά με τη χρήση της μεθόδου self. Αυτό αποκαλείται ως αναφορά ιδιοχαρακτηριστικού (attribute reference) Σε αυτό το πρόγραμμα, βλέπουμε επίσης τη χρήση docstrings για κλάσεις αλλά και για μεθόδους. Μπορούμε να προσπελάσουμε τις docstring της κλάσης ενόσω τρέχει το πρόγραμμα χρησιμοποιώντας το Robot. doc και τη μέθοδο docstring ως Robot.sayHi. doc Ακριβώς όπως η μέθοδος init, υπάρχει η ειδική μέθοδος del και καλείται όταν τερματίζεται ένα αντικείμενο, δηλαδή όταν αποδεσμεύεται και επιστρέφεται στο σύστημα για επαναχρησιμοποίηση αυτή η περιοχή μνήμης. Σε αυτή τη μέθοδο, μειώνουμε τον αριθμό των ρομπότ Robot.population κατά 1. Η μέθοδος del εκτελείται όταν το αντικείμενο δεν είναι σε χρήση πλέον και δεν εγγυάται πότε θα εκτελεστεί αυτή. Αν θέλετε να το δείτε σε δράση, πρέπει να χρησιμοποιήσετε την εντολή del και το έχουμε κάνει εδώ.

Μεταβλητές κλάσης και αντικειμένου Όλα τα μέλη κλάσης (class members) (συμπεριλαμβανομένων και των μελών δεδομένων (data members)) είναι δημόσια (public) και όλες οι μέθοδοι είναι εικονικές (virtual) στην Python. Μια εξαίρεση: Για την ονομασία μελών δεδομένων με τη χρήση του διπλού προθέματος κάτω παύλας (double underscore prefix), π.χ privatevar, η Python χρησιμοποιεί κατάτμηση ονόματος (name-mangling) για να οριστεί η μεταβλητή ως ιδιωτική αποτελεσματικά Άρα, η σύμβαση που ακολουθείται είναι ότι η χρήση μιας μεταβλητής εντός αποκλειστικά μιας κλάσης ή ενός αντικειμένου, οφείλει να ξεκινά με μια κάτω παύλα και ότι όλα τα υπόλοιπα ονόματα είναι δημόσια (public) και μπορούν να χρησιμοποιηθούν από άλλες κλάσεις/αντικείμενα. Να θυμάστε ότι μιλάμε μόνο για μια σύμβαση και δεν επιβάλλεται από την Python (με εξαίρεση το διπλό πρόθεμα κάτω παύλας)

Κληρονομικότητα (Inheritance) Ένα από τα σημαντικά οφέλη του αντικειμενοστραφούς προγραμματισμού είναι η επαναχρησιμοποίηση (reuse) του κώδικα και ένας από τους τρόπους που επιτυγχάνεται είναι μέσω του μηχανισμού της κληρονομικότητας. Ας υποθέσουμε ότι θέλετε να γράψετε ένα πρόγραμμα που καταγράφει τους καθηγητές και τους μαθητές ενός κολλεγίου. Έχουν κάποια κοινά χαρακτηριστικά - ονοματεπώνυμο, ηλικία και διεύθυνση κατοικίας. Επίσης, έχουν ιδιαίτερα χαρακτηριστικά - μισθοδοσία, μαθήματα και άδειες για τους καθηγητές, βαθμολογία και δίδακτρα για τους μαθητές. Μπορείτε να δημιουργήσετε δύο ανεξάρτητες κλάσεις για κάθε τύπο και να τις επεξεργαστείτε, αλλά η προσθήκη ενός νέου κοινού χαρακτηριστικού θα απαιτούσε την προσθήκη του και στις δύο αυτές ανεξάρτητες κλάσεις. Καταντά δύσχρηστη αυτή η προσέγγιση.

Κληρονομικότητα (Inheritance) Μια καλύτερη λύση θα ήταν να δημιουργηθεί μια κοινή κλάση με το όνομα SchoolMember και κατόπιν οι κλάσεις καθηγητές και μαθητές να κληρονομήσουν από αυτή, δηλαδή να γίνουν υποτύποι αυτού του τύπου (κλάση) και στη συνέχεια να προσθέσουμε ειδικά χαρακτηριστικά σε αυτούς τους υποτύπους Εάν προσθέσουμε/αλλάξουμε κάποια λειτουργία στην κλάση SchoolMember, αυτομάτως ενημερώνονται και οι υποτύποι. Για παράδειγμα, ένα πεδίο αριθμού ταυτότητας για τους μαθητές και τους καθηγητές είναι εφικτό εύκολα με την προσθήκη του στην κλάση SchoolMember. Ωστόσο, οι αλλαγές σε έναν υποτύπο δεν επηρεάζουν τους άλλους υποτύπους. Ένα άλλο πλεονέκτημα είναι ότι εάν μπορούμε να αναφερθούμε σε ένα αντικείμενο καθηγητή ή μαθητή ως αντικείμενο SchoolMember, θα μας φανεί χρήσιμο σε καταστάσεις για τον υπολογισμό του συνολικού αριθμού των μελών του κολλεγίου. Η ιδιότητα αυτή αποκαλείται πολυμορφισμός (polymorphism) όπου ένας υποτύπος μπορεί να αντικατασταθεί σε κάθε περίπτωση που περιμένουμε ένα γονικό τύπο, δηλαδή το αντικείμενο μπορούμε να το χειριστούμε σαν μια υπόσταση της γονικής κλάσης

Κληρονομικότητα (Inheritance) Η κλάση SchoolMember σε αυτή την περίπτωση ονομάζεται βασική κλάση (base class) ή υπερκλάση (superclass). Οι κλάσεις Teacher και Student αποκαλούνται παράγωγες κλάσεις (derived classes) ή υποκλάσεις (subclasses) class SchoolMember: '''Represents any school member.''' def init (self, name, age): self. name = name self. age = age print('(initialized SchoolMember: {0})'. format(self. name)) def tell(self): ''Tell my details.''' print('name:"{0}" Age:"{1}"'. format(self. name, self. age), end="")

Κληρονομικότητα (Inheritance) class Teacher(SchoolMember): '''Represents a teacher.''' def init (self, name, age, salary): SchoolMember. init (self, name, age) self. salary = salary print('(initialized Teacher: {0})'. format(self. name)) def tell(self): SchoolMember. tell(self) print('salary: "{0:d}"'. format(self. salary)) class Student(SchoolMember): '''Represents a student.''' def init (self, name, age, marks): SchoolMember. init (self, name, age) self. marks = marks print('(initialized Student: {0})'. format(self. name)) def tell(self): SchoolMember. tell(self) print('marks: "{0:d}"'. format(self. marks))

Κληρονομικότητα (Inheritance) t = Teacher('Mrs. Shrividya', 40, 30000) s = Student('Swaroop', 25, 75) print() # εκτυπώνει μια κενή γραμμή members = [t, s] for member in members: member. tell() # works for both Teachers and Students

Κληρονομικότητα (Inheritance) Έξοδος: $ python inherit.py (Initialized SchoolMember: Mrs. Shrividya) (Initialized Teacher: Mrs. Shrividya) (Initialized SchoolMember: Swaroop) (Initialized Student: Swaroop) Name:"Mrs. Shrividya" Age:"40" Salary: "30000" Name:"Swaroop" Age:"25" Marks: "75"

Κληρονομικότητα (Inheritance) Η Python υποστηρίζει την πολλαπλή κληρονομικότητα. Ο ορισμός μιας κλάσης που κληρονομεί περισσότερες κλάσεις έχει τη μορφή: class ονομα_κλάσης(υπερκλάση1,υπερκλάση2, ): εντολές

Κληρονομικότητα (Inheritance) Αν στο προηγούμενο πρόγραμμα αφαιρέσουμε το χαρακτήρα # και εκτελεστή η τελευταία εντολή, Θα πάρουμε μήνυμα σφάλματος της μορφής: Child object has no attribute name Γιατί η τιμή της name δεν είναι γνωστή στο αντικείμενο τύπου Child, επειδή η μέθοδος init της κλάσης Father δεν εκτελείται αυτόματα. Η μέθοδος init της υπερκλάσης καλείται μόνο όταν η υποκλάση δε διαθέτει μέθοδο αρχικοποίησης ή γίνει έμμεση άμμεση αναφορά στην αντίστοιχη μέθοδο της υπερκλάσης. Η κλήση σε οποιαδήποτε μέθοδο μιας υπερκλάσης γίνεται με τη μέθοδο super() ή ρητά χρησιμοποιώντας το όνομα της υπερκλάσης:

Ενθυλάκωση Η python δεν υποστηρίζει πραγματική ενθυλάκωση, αφού δεν επιτρέπει περιορισμούς πρόσβασης Για να επισημάνουμε ένα αναγνωριστικό ως ιδιωτικό θέτουμε ως πρώτο χαρακτήρα στο όνομά του την κάτω παύλα (_). Χωρίς να περιορίζεται η πρόσβαση απλά αποθαρρύνεται η προσπέλασή του έξω από την κλάση. Αν το όνομα ενός αναγνωριστικού αρχίζει με δύο κάτω παύλες ( ) τότε η πρόσβαση επιτρέπεται μόνο μέσα από τη κλάση Η μέθοδος printdata() ιδιωτική, η κλήσης της στη γραμμή 9 είναι επιτυχής Αντίθετα η άμεση κλήση της στη γραμμη 10 θα δημιουργήσει εξαίρεση

Ενθυλάκωση Ένα ιδιωτικό αναγνωριστικό μπορεί να προσπελαστεί έμμεσα με το συμβολισμό: Instancename_classname_attribute

Στατικές μέθοδοι και μέθοδοι κλάσης Μια κλάση στη Python μπορεί να διαθέτει και στατικές μεθόδους. Μια στατική μέθοδος μπορεί να κληθεί χωρίς τη δημιουργία στιγμιότυπού και είναι κοινή για όλα τα στιγμιότυπα και τις υποκλάσεις Μια μέθοδος κλάσης μπορεί να κληθεί χωρίς τη δημιουργία στιγμιότυπου, αρκεί να έχει όμως ως πρώτη παράμετρο μια αναφορά στη κλάση Η κύρια χρήση των μεθόδων κλάσης είναι η δημιουργία εναλλακτικών κατασκευαστών καθώς η python διαθέτει μια μόνο μέθοδο κατασκευαστή ( init ) Η δημιουργία μιας στατικής μεθόδου γίνεται με τη χρήση του διακοσμητή @staticmethod πριν τον ορισμό της. Η δημιουργία μιας μεθόδους κλάσης γίνεται με τη χρήση του διακοσμητή @classmethod πριν από τον ορισμό της.

Στατικές μέθοδοι και μέθοδοι κλάσης Οι μέθοδοι stotalarea() και ctotalarea() υπολογίζουν και επιστρέφουν την επιφάνεια όλων των στιγμιότυπων που έχουν δημιουργηθεί. Ο ορισμός της μεθόδου ctotalarea() διαθέτει ως 1 η παράμετρο μια αναφορά cls. Η ύπαρξη της αναφοράς στη κλάση έχει σαν αποτέλεσμα μια υποκλάση της να μπορεί να καλέσει τη δική της ομώνυμή μέθοδο και όχι της γονικής Η κλήση της γίνεται με αναφορά κλάσης όπως φαίνεται στις τελευταίες γραμμές του κώδικα

Στατικές μέθοδοι και μέθοδοι κλάσης Το επόμενο παράδειγμα δημιουργεί δύο στιγμιότυπα της κλάσης integer, το P το πρώτο με τη χρήση της init και το δεύτερο με τη μέθοδο κλάσης new_int()

Υπερφόρτωση Τελεστών Η υπερφόρτωση τελεστών μας επιτρέπει να ορίζουμε τη λειτουργία των τελεστών όταν τους χρησιμοποιούμαι σε κλάσεις οριζόμενες από το χρήστη. Η παρακάτω κλάση αναπαριστά ένα μιγαδικό αριθμό: Η μέθοδος add() της κλάσης προσθέτει 2 αντικείμενα τύπου Cplx. Θα ήταν όμως πιο καλά να εκτελέσουμε την πρόσθεση με την εντολή a+b αντί να καλέσουμε τη μέθοδο a.add(b). Με την υπερφόρτωση τελεστών μπορούμε να υπερφορτώσουμε τον τελεστή + ορίζοντας τη μέθοδο add στην προηγούμενη κλάση η οποία θα εκτελεί την πρόσθεση 2 αντικειμένων της.

Υπερφόρτωση Τελεστών Η ειδική μέθοδος str μας επιτρέπει να αναπαραστήσουμε ένα αντικείμενο ως αλφαριθμητικό. Καλείται αυτόματα όταν τυπώνουμε ένα αντικείμενο με τη συνάρτηση print()

Υπερφόρτωση Τελεστών ΤΕΛΕΣΤΗΣ ΠΑΡΑΣΤΑΣΗ ΜΕΘΟΔΟΣ Πρόσθεση a+b a. add(b) Αφαίρεση a1-b a. sub (b) Πολλαπλασιασμός a1*b a mul (b) Ύψωση σε δύναμη a1**b a. pow (b) Διαίρεση a1/b a. truediv (b) Ακέραια διαίρεση a1//b a. floordiv (b) Υπόλοιπο ακέραιας διαίρεσης a1%b a. mod (b) Αριστερή ολίσθηση a1<<b a. lshift (b) Δεξιά ολίσθηση a1>>b a. rshift (b) Bitwise And a1 & b a. and (b) Bitwise OR a1 b a. or (b) Bitwise XOR a1 ^b a. xor (b) Bitwise Not ~a a. invert () Μικρότερο a<b a. lt (b) Μικρότερο ή ίσο a<=b a. le (b) Ίσο a==b a. eq (b) Όχι ίσο a!=b a. ne (b) Μεγαλύτερο a>b a. gt (b) Μεγαλύτερο ή ίσο a>=b a. ge (b)

Υπερφόρτωση Τελεστών Αν θέλουμε να δούμε αν 2 μιγαδικοί είναι ίσοι θα πρέπει στη κλάση Cplx να ορίσουμε τη μέθοδο eq ():

Παραδείγματα: Κύκλος

Παραδείγματα: Κατοικίδια Η κλάση Pet διαθέτει 2 μεθόδους τη getname() και gettype(), οι οποίες επιστρέφουν το όνομα και το είδος του κατοικίδιου. Η μέθοδος str () αναπαριστά το αντικείμενο ως αλφαριθμητικό. Καλείται αυτόματα όταν τυπώνουμε ένα αντικείμενο με τη print(). Η κλάση Dog κληρονομεί όλα τα χαρακτηριστικά της κλάσης Pet. Έχει μια παραπάνω μέθοδο τη likecats() για το να συμπαθεί τις γάτες ή όχι. Το ίδιο φτιάχνουμε και για την Cat.

Παραδείγματα: Αναπαράσταση διανύσματος στο χώρο Magnitude=m Distance= 2 1 2 1 2 1 Ο υπολογισμός του μήκους του διανύσματος έγινε χρησιμοποιώντας γεννήτρια εκφράσεων που έχει παρόμοια σύνταξη με τις υπογιζόμενες λίστες απλά αντί για αγκύλες βάζουμε παρενθέσεις. Η ενσωματωμένη μέθδος zip() επιτρέπει να διατρέξουμε παράλληλα 2 (ή περισσότερες ακολουθίες με τον ίδιο βρόγχο for. H sum και η sqrt είναι συναρτήσεις της βιβλιοθήκης math

Παραδείγματα: Κατασκευή κλάσης για την αποθήκευση στοιχείων πελατών

Παραδείγματα: Κατασκευή κλάσης που θα αρχικοποιείται με όνομα & επώνυμο. Η κλάση θα περιέχει και μια μέθοδο κατασκευαστή που θα επιτρέπει τη δημιουργία ενός στιγμιότυπου το οποίο αρχικοποιείται με ένα αλφαριθμητικό Η μέθοδος splitname() έχει ως πρώτη παράμετρο μια αναφορά στη κλάση cls και ως δεύτερη παράμετρο το ονοματεπώνυμο. Η μέθοδος split() χωρίζει ένα αλφαριθμητικό στις λέξεις από τις οποίες αποτελείται χρησιμοποιώντας το κενό χαρακτήρα ως προκαθορισμένο διαχωριστικό χαρακτήρα. Η μέθοδος κλάσης αρχικοποιεί και επιστρέφει το αντικείμενο

Παραδείγματα: Κατασκευή κλάσης για την χρησιμοποίησή της ως επαναλήπτη Η δημιουργία επαναλήπτη απαιτεί τον ορισμό της μεθόδου iter η οποία επιστρέφει ένα αντικείμενο iterator και της μεθόδου next που επιστρέφει το επόμενο διαθέσιμο στοιχείο. Η μέθοδος iter απλώς επιστρέφει μια αναφορά στο αντικείμενο. Κάθε επανάληψη του βρόγχου for καλεί τη μέθοδο next η οποία επιστρέφει την επόμενη τιμή μέχρι να προκληθεί μια εξαίρεση Stopiteration όταν δεν υπάρχουν άλλες.