Εργαλεία Χρήστη

Εργαλεία ιστότοπου


oopython

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

Εισαγωγή

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

Ιστορική αναδρομή στις μεθόδους προγραμματισμού

Στην αρχή (έως την δεκαετία του 1960) κυριαρχούσε ο γραμμικός τρόπος προγραμματισμού ( http://en.wikipedia.org/wiki/Spaghetti_code ). Οι προγραμματιστές έγραφαν τις εντολές τους στην σειρά και όποτε χρειαζόταν μια διακλάδωση τότε χρησιμοποιούσαν την εντολή GOTO. Ο κώδικας ήταν συμπαγής εξαιρετικά γρήγορος αλλά είχε τεράστια μειονεκτήματα ιδίως στην δυνατότητα διαχείρισης, συντήρησης και εκσφαλμάτωσης του. Κύριες γλώσσες γραμμικού προγραμματισμού είναι η Assembly και άλλες γλώσσες της εποχής όπως η Basic και η Fortran V.

Την δεκαετία του 1970 επικράτησε ο δομημένος προγραμματισμός ( http://en.wikipedia.org/wiki/Structured_programming ) ο οποίος κατάργησε την χρήση του GOTO. Αυτό επετεύχθη με την δημιουργία των προγραμματιστικών μονάδων δηλαδή των δομών και των υποπρογραμμάτων. Κάθε φορά που απαιτείται μια πρόσθετη εργασία αντί της διακλάδωσης επιλέγεται η χρήση μιας ομάδας εντολών σαφώς διακριτών από τις υπόλοιπες. Αυτές οι ομάδες είτε είναι τμήματα εντολών ελέγχου ή επανάληψης είτε είναι υποπρογράμματα. Περιέχουν δε οποιοδήποτε πλήθος ή συνδυασμό άλλων εντολών. Γλώσσες δομημένου προγραμματισμού οι οποίες παραμένουν έως σήμερα είναι η C και η Pascal.

Τέλος από την δεκαετία του 1990 και μετά άρχισε να κυριαρχεί ο αντικειμενοστραφής προγραμματισμός ( http://en.wikipedia.org/wiki/Object-oriented_programming ). Τώρα οι “ομάδες” του δομημένου ονομάστηκαν κατηγορίες-τάξεις-κλάσεις και εκτός από εντολές (αλγόριθμους) περιέχουν και μεταβλητές (δεδομένα). Στο πλαίσιο λειτουργιών ενός αντικειμένου (ή καλύτερα μιας κατηγορίας) συμπεριλαμβάνονται τόσο οι μέθοδοι (αλγόριθμοι) που το αφορούν με την μορφή υποπρογραμμάτων όσο και τα δεδομένα (μεταβλητές) που το περιγράφουν. Κάθε αντικείμενο είναι η στιγμιαία έκφραση μιας κατηγορίας και περιλαμβάνει το δικά του χαρακτηριστικά στις μεταβλητές της κατηγορίας του και δικαίωμα χρήσης των υποπρογραμμάτων-μεθόδων της. Σήμερα κύριες γλώσσες αντικειμενοστραφούς προγραμματισμού είναι η C++, η Python και η Java.

1ο Παράδειγμα

Ορισμός κατηγοριών με χαρακτηριστικά και μεθόδους. Δήλωση αντικειμένων και χρήση τους.

Έστω ότι έχουμε να δουλέψουμε με κύκλους. Για να δούμε ένα παράδειγμα:

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
#Filename: cycle.py - 1ο/3 μέρη - 1η έκδοση

from math import pi # θα το χρειαστούμε στον υπολογισμό περιμέτρου

class cycle:
	'''Αυτή είναι η κατηγορία του κύκλου'''
def __init__(self,r=1):
	self.rad=r
	print('Αρχικοποιήθηκε κύκλος με ακτίνα :',self.rad)

def perimeter(self):
	return self.rad*2*pi

Με την εντολή class ορίζουμε την νέα κατηγορία αντικειμένων cycle. Το υποπρόγραμμα init (Προσοχή! Δεσμευμένο όνομα) είναι το υποπρόγραμμα το οποίο εκτελείται με ΚΑΘΕ δήλωση ενός αντικειμένου κύκλου. self είναι ΠΑΝΤΑ το πρώτο όρισμα και αντιπροσωπεύει το κάθε αντικείμενο. Η διαδικασία αυτή ορίζει την ακτίνα ενός κύκλου rad ενώ αν δεν υπάρχει τιμή βάζει 1. Το υποπρόγραμμα perimeter υπολογίζει και επιστρέφει την περίμετρο ενός κύκλου.

Για να δούμε και 2-3 εντολές χρήσης:

#Filename: cycle.py - 2ο/3 μέρη - 1η έκδοση
a=cycle(5);
print('Η ακτίνα του κύκλου είναι:', a.rad)
print('Η περίμετρος του κύκλου είναι:', a.perimeter())

Εδώ ορίζουμε τον κύκλο a με ακτίνα 5. Εμφανίζουμε στην οθόνη την ακτίνα και την περίμετρό του.

#Filename: cycle.py - 3ο/3 μέρη - 1η έκδοση
b=cycle();
print('Η ακτίνα του κύκλου είναι:', b.rad)
print('Η περίμετρος του κύκλου είναι:', b.perimeter())

Εδώ ορίζουμε τον κύκλο a χωρίς ρύθμιση της ακτίνας και άρα θα πάρει την τιμή 1. Εμφανίζουμε στην οθόνη την ακτίνα και την περίμετρό και αυτού του κύκλου.

Παρατήρηση: Παρατηρούμε ότι η αναφορά στο χαρακτηριστικό rad του αντικειμένου a της κατηγορίας cycle γίνεται με την χρήση του b.rad ενώ για την μέθοδο perimeter χρησιμοποιείται η b.perimeter() (με παρενθέσεις). Επειδή αφενός η δήλωση των χαρακτηριστικών δεν είναι τόσο εμφανής όπως των μεθόδων και αφετέρου δεν είναι εύκολο να θυμόμαστε πάντα αν το στοιχείο rad ή perimeter είναι χαρακτηριστικό ή μέθοδος και άρα θέλει ή δεν θέλει παρένθεση μια καλή πρακτική είναι η εξής: για όλα τα χαρακτηριστικά τα οποία θέλουμε να είναι διαθέσιμα κατά την χρήση των αντικειμένων που τα περιέχουν φτιάχνουμε ανάλογες μεθόδους απόδοσης ή λήψης τιμής. Το παραπάνω παράδειγμα μετά και τον εξελληνισμό των αναγνωριστικών του παίρνει την ακόλουθη μορφή:

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
#Filename: cycle.py - 1ο/1 μέρη - 2η έκδοση με Ελληνικά !
from math import pi
class Κύκλος:
'''Αυτή είναι η κατηγορία του κύκλου'''
def __init__(self,ρ=1):
	self.rad=ρ
	print('Αρχικοποιήθηκε κύκλος με ακτίνα :',self.rad)

def Βάλε_Ακτίνα(self,ρ=1):
	self.rad=ρ
	print('O κύκλος απέκτησε ακτίνα :',self.rad)

def Ακτίνα(self):
	return self.rad

def Περίμετρος(self):
	return self.rad*2*pi

Αλφα=Κύκλος(5);
print('Η ακτίνα του κύκλου είναι:', Αλφα.Ακτίνα())
print('Η περίμετρος του κύκλου είναι:', Αλφα.Περίμετρος())
Βήτα=Κύκλος();
Βήτα.Βάλε_Ακτίνα(3);
print('Η ακτίνα του κύκλου είναι:', Βήτα.Ακτίνα())
print('Η περίμετρος του κύκλου είναι:', Βήτα.Περίμετρος())

2ο Παράδειγμα

Κληρονομικότητα και Πολυμορφισμός
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
#Filename: Σχολές.py - Έκδοση με Ελληνικά !

class Ίδρυμα:
'''Αυτή είναι η κατηγορία ιδρύματος ανώτατης εκπαίδευσης'''
def __init__(self, Όνομα):
	self.τίτλος=Όνομα
	print('Αρχικοποιήθηκε το ίδρυμα :',self.τίτλος)

def Όνομα(self):
	return self.τίτλος

def Τίτλος(self): # Ίδια με την προηγούμενη αλλά ορατή από την κατηγορία Σχολή
	return self.τίτλος

def Βάλε_Είδος(self,Είδος='AEI'):
	self.είδος=Είδος;
	print('Το ίδρυμα', self.τίτλος,' είναι : ',self.είδος)

def Είδος(self):
	return self.είδος

class Σχολή(Ίδρυμα): # ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ: Η κατηγορία Σχολή είναι θυγατρική της κατηγορίας Ίδρυμα
'''Αυτή είναι η κατηγορία σχολής ενός ιδρύματος ανώτατης εκπαίδευσης'''
def __init__(self, Όνομα, ίδρυμα):
	self.όνομα=Όνομα
	self.τίτλος=ίδρυμα.τίτλος
	print('Αρχικοποιήθηκε η σχολή :',self.όνομα, 'του ιδρύματος',self.τίτλος)

def Όνομα(self): # ΠΟΛΥΜΟΡΦΙΣΜΟΣ: Μέθοδος με ίδιο όνομα με αυτό μητρικής κατηγορίας
	return self.όνομα

def Βάλε_Επίπεδο(self,Επίπεδο='Masters'):
	self.επίπεδο=Επίπεδο;
	print('Η σχολή', self.όνομα,'είναι επιπέδου : ',self.επίπεδο)

def Επίπεδο(self):
	return self.επίπεδο

ΕΜΠ=Ίδρυμα('ΕΘνικόν Μετσόβιον Πολυτεχνείον')
ΕΜΠ.Βάλε_Είδος('Α.Ε.Ι.')
print('Το ίδρυμα', ΕΜΠ.Όνομα(),' είναι : ', ΕΜΠ.Είδος())

ΣΑΤΜ=Σχολή('Αγρονόμων και Τοπογράφων Μηχανικών',ΕΜΠ)
ΣΑΤΜ.Βάλε_Επίπεδο()
print('Η σχολή ', ΣΑΤΜ.Όνομα(), 'του', ΣΑΤΜ.Τίτλος(), 'είναι επιπέδου : ', ΣΑΤΜ.Επίπεδο())

ΣΗΜΜΗΥ=Σχολή('Ηλεκτρολόγων Μηχανικών και Μηχανικών Ηλεκτρονικών Υπολογιστών',ΕΜΠ)
ΣΗΜΜΗΥ.Βάλε_Επίπεδο("Masters++ :-) ")
print('Η σχολή ', ΣΗΜΜΗΥ.Όνομα(), 'του', ΣΗΜΜΗΥ.Τίτλος(), 'είναι επιπέδου : ', ΣΗΜΜΗΥ.Επίπεδο())

if ΣΗΜΜΗΥ.Τίτλος() == ΣΑΤΜ.Τίτλος():
print('Η σχολή ', ΣΑΤΜ.Όνομα(), 'και η σχολή ',ΣΗΜΜΗΥ.Όνομα(), 'είναι στο ',ΣΗΜΜΗΥ.Τίτλος())

print('Η σχολή ', ΣΑΤΜ.Όνομα(), 'και η σχολή ',ΣΗΜΜΗΥ.Όνομα())
if ΣΗΜΜΗΥ.Επίπεδο() != ΣΑΤΜ.Επίπεδο():
print (' ΔΕΝ ')
print (' έχουν το ίδιο επίπεδο σπουδών.')

print('Η σχολή ')
if ΣΗΜΜΗΥ.Επίπεδο() > ΣΑΤΜ.Επίπεδο():
print(ΣΗΜΜΗΥ.Όνομα())
elif ΣΗΜΜΗΥ.Επίπεδο() < ΣΑΤΜ.Επίπεδο():
      print(ΣATM.Όνομα())
print('έχει υψηλότερο επίπεδο σπουδών. :-)')

Μελετήστε προσεκτικά το παράδειγμα αυτό και σχολιάστε μόν-οι/ες σας τις έννοιες της κληρονομικότητας και του πολυμορφισμού.

Καλό αντικειμενοστραφή κώδικα με Python.

oopython.txt · Τελευταία τροποποίηση: 2023/02/08 12:09 από chiossif