Python

ΕΝΟΤΗΤΑ 26 - Multiple Inheritance

image description

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

Όπως ήδη έχουμε αναλύσει σε προηγούμενες ενότητες, η λειτουργία της κληρονομικότητας μας επιτρέπει να χρησιμοποιήσουμε methods και attributes τις οποίες λαμβάνουμε από μια άλλη κλάση έτσι ώστε να αποφεύγουμε επαναλήψεις του ίδιου κώδικα. Ένα απλό παράδειγμα, όπως το έχουμε δει ήδη, είναι εκείνο του εργαζόμενου σε μια εταιρεία. Δημιουργήσαμε μια απλή κλάση με το όνομα Employee, και μετά δημιουργήσαμε κλάσεις όπως SalaryEmployee και PartnerEmployee οι οποίες κληρονομούσαν από την Employee τις μεθόδους της και τις μεταβλητές της. Στην SalaryEmployee όπως και στην PartnerEmployee αυτό που είχαμε να κάνουμε ήταν απλά να προσθέσουμε τις έξτρα μεθόδους και μεταβλητές που θέλαμε να περιέχουν αυτές οι δύο συγκεκριμένες κλάσεις. Ένα απλό σχεδιάγραμμα τις διάταξης της κληρονομικότητας σε αυτό το σενάριο μπορούσε να είναι το εξής:

Δωρεάν Μαθήματα και Σεμινάρια PYTHON

Στο παραπάνω σχεδιάγραμμα, κάθε child κλάση (SalaryEmployee, ExternalPartner) κληρονομεί από μια κοινή parent κλάση (Person).

Είναι όμως δυνατόν να μπορούμε να κληρονομήσουμε από μια πολλαπλές κλάσεις ταυτόχρονα. Ίσως κάποιες φορές να χρειαζόμαστε τις μεταβλητές αλλά κυρίως τις μεθόδους από πολλαπλές κλάσεις για να δημιουργήσουμε μια δική μας καινούργια κλάση που θα τις χρησιμοποιεί και θα τις συνδυάζει όλες. Για παράδειγμα θα μπορούσαμε να δημιουργήσουμε μια καινούργια κλάση που την ονομάζουμε EmployeeMeetings που θα κληρονομούσε ιδιότητες από την κλάση Employee και από την Calendar κλάση της Python.

Δωρεάν Μαθήματα και Σεμινάρια PYTHON

Ας υποθέσουμε λοιπόν ότι θέλουμε να δημιουργήσουμε μια εφαρμογή για το HR όπου θα μπορούν να κλείνουν ραντεβού με τους εργαζόμενους.

Μια καινούργια εντολή, στην οποία θα αναφερθούμε εκτενέστερα σε μελλοντική ενότητα είναι εκείνη της import. Με την import μπορούμε να ενημερώσουμε το αρχείο μας ( app.py στην δική μας περίπτωση) ότι θα χρησιμοποιήσουμε και κάποιες επιπρόσθετες βιβλιοθήκες εκτός από τις default που μας προσφέρει η Python για απλά προγράμματα. Στο πρόγραμμα μας ενημερώνουμε τον κώδικα μας ότι επιθυμούμε να χρησιμοποιήσουμε και την datetime βιβλιοθήκη της Python. Επαναλαμβάνω ότι αν δεν καταλαβαίνετε απολύτως τι σημαίνει import θα το αναλύσουμε σε μελλοντική ενότητα. Για τώρα απλά θέλουμε να προσθέσουμε την δυνατότητα εισαγωγής μια ημερομηνίας στο πρόγραμμα μας.

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

App.py


import datetime

class Employee():
	
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	def showmessage(self):
		print("This is the Employee")

	def __str__(self):
		return f'First Name = {self.first_name}, Last Name = {self.last_name}'
	
class Calendar():
	def employee_appointment(self, date):
		print('Booking appointment for date %s' %date)
	
class HrDepartment(Employee, Calendar):
	pass
	
	michail = HrDepartment('Michail', 'Kassapoglou')
	michail.showmessage()
	print(michail)
	michail.employee_appointment(datetime.date(2018,1,1))
	
         

Output


This is the Employee
First Name = Michail, Last Name = Kassapoglou
Booking appointment for date 2018-01-01	
	 

Έχουμε λοιπόν μια κλάση Employee από την οποία μπορούμε να δημιουργήσουμε ένα αντικείμενο με τα χαρακτηριστικά first name και last name. Στην ίδια κλάση έχουμε προσθέσει δύο functions από τις οποίες η πρώτη παρουσιάζει ένα απλό μήνυμα, ενώ η δεύτερη δείχνει τις τιμές που έχει το αντικείμενο.

Η δεύτερη κλάση με το όνομα Calendar περιέχει μια function που αφού δεχτεί σαν παράμετρο την ημερομηνία, μας την εμφανίζει στο terminal.

Η κλάση HrDepartment είναι εκεί όπου εφαρμόζουμε την πολλαπλή κληρονομικότητα. Αυτό το επιτυγχάνουμε γράφοντας και τα ονόματα και των δύο κλάσεων μέσα στην παρένθεση. Η ιδέα είναι ακριβώς ίδια με εκείνη της απλή κληρονομικότητας, αλλά αυτή τη φορά κληρονομούμε ταυτόχρονα και από τις δύο κλάσεις. Για αρχή έχουμε αφήσει την HrDepartment κλάση κενή, όμως αυτό δεν μας εμποδίζει να δημιουργήσουμε ένα αντικείμενο. Λόγω της κληρονομικότητας από την κλάση Employee μπορούμε να δημιουργήσουμε το αντικείμενο μας περνώντας το first name και το last name, ενώ λόγω της κληρονομικότητας από την δεύτερη κλάση μπορούμε να καλέσουμε τη function employee_appointment.

Ας υποθέσουμε τώρα ότι θέλουμε να ενημερώσουμε τον χρήστη ότι θα κλείσει ραντεβού με το HR. Μπορούμε να το πετύχουμε αυτό κάνοντας override την employee_appointment function όπως έχουμε ήδη μάθει από προηγούμενη ενότητα. Επίσης δεν θέλουμε να γράψουμε τον κώδικα της employee_appointment από την αρχή αλλά να προσθέσουμε έξτρα κώδικα σε αυτή. Οπότε μπορούμε να χρησιμοποιήσουμε την super( ) για αυτό το σκοπό.

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

App.py


import datetime

class Employee():
	
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	def showmessage(self):
		print("This is the Employee")

	def __str__(self):
		return f'First Name = {self.first_name}, Last Name = {self.last_name}'
	
class Calendar():
	def employee_appointment(self, date):
		print('Booking appointment for date %s' %date)
	
class HrDepartment(Employee, Calendar):
	def employee_appointment(self, date):
		print('You are booking an appointment with HR')
		super().employee_appointment(date)
	
	michail = HrDepartment('Michail', 'Kassapoglou')
	michail.showmessage()
	print(michail)
	michail.employee_appointment(datetime.date(2018,1,1))
	
	
         

Output


This is the Employee
First Name = Michail, Last Name = Kassapoglou
You are booking an appointment with HR       
Booking appointment for date 2018-01-01  
	
	 

Αν τώρα θέλουμε να προσθέσουμε και την init function στην HrDepartment κλάση έτσι ώστε να ορίσουμε με περισσότερες λεπτομέρειες πως θέλουμε να δημιουργούμε τα αντικείμενα μας, τότε θα χρειαστεί να καλέσουμε και την init από την Employee κλάση. Εδώ όμως υπάρχει μια διαφορά από την απλή κληρονομικότητα – καλούμε την init της Employee με το όνομα της κλάσης και την init χωρίς την χρήση της super( ). Ας δούμε πως αλλάζει πάλι ο κώδικα μας.

App.py


import datetime

class Employee():
	
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	def showmessage(self):
		print("This is the Employee")

	def __str__(self):
		return f'First Name = {self.first_name}, Last Name = {self.last_name}'

class Calendar():
	def employee_appointment(self, date):
		print('Booking appointment for date %s' %date)

class HrDepartment(Employee, Calendar):

	def __init__(self, id, first_name, last_name):
		self.id = id
		Employee.__init__(self, first_name, last_name)

	def employee_appointment(self, date):
		print('You are booking an appointment with HR')
		super().employee_appointment(date)
		
	def __str__(self):
		return f'ID = {self.id}, First Name = {self.first_name}, Last Name = {self.last_name}'

michail = HrDepartment(100, 'Michail', 'Kassapoglou')
michail.showmessage()
print(michail)
michail.employee_appointment(datetime.date(2018,1,1))

         

Output


This is the Employee
ID = 100, First Name = Michail, Last Name = Kassapoglou
You are booking an appointment with HR
Booking appointment for date 2018-01-01
	 

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

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

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

loader