Python

ΕΝΟΤΗΤΑ 25 - Method Override

image description

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

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

Στο παρακάτω παράδειγμα, έχουμε προσθέσει μια καινούργια μέθοδο με το όνομα showmessage( ) στην κλάση Employee. Σκοπός αυτής της μεθόδου είναι απλά να δείχνει ένα μήνυμα στην οθόνη για να μπορούμε εύκολα να αναγνωρίσουμε σε ποιο αντικείμενο αναφερόμαστε. Αυτή την μέθοδο, λόγω της κληρονομικότητας που υπάρχει, την κληρονομεί η κλάση SalaryEmployee και η κλάση ExternalPartner. Όμως η κλάση SalaryEmployee δεν μπορεί να δείχνει το ίδιο μήνυμα με εκείνο της Salary. Οπότε, κρατάμε το όνομα της μεθόδου το ίδιο και γράφουμε καινούργιο μήνυμα που δείχνει ότι το αντικείμενο προέρχεται από την κλάση SalaryEmployee. Με την ίδια λογική, αλλάζουμε και τον κώδικα της μεθόδου που έχει κληρονομήσει η κλάση ExternalPartner. Τώρα όταν δημιουργούμε τα αντικείμενα μας και καλούμε την showmessage( ) μέθοδο, κάθε αντικείμενο θα έχει το δικό της μήνυμα.

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

App.py


class Employee():

    def __init__(self, id, name, department):
        self.name = name
        self.id = id
        self.department = department

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

    def __str__(self):
        return f'id={self.id}, name={self.name}, salary={self.salary}, department={self.department}'

class SalaryEmployee(Employee):
    def __init__(self, id, name, department, monthlysalary):
        self.monthlysalary = monthlysalary
        super().__init__(id, name, department)

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

    def __str__(self):
        return f'id={self.id}, name={self.name}, salary={self.monthlysalary}, department={self.department}'

class ExternalPartner(Employee):
    def __init__(self, id, name, department, hourlysalary):
        self.hourlysalary = hourlysalary
        super().__init__(id, name, department)

    def showmessage(self):
        print("This is the External Partner")

    def __str__(self):
        return f'id={self.id}, name={self.name}, salary={self.hourlysalary}, department={self.department}'

salaryEmployee = SalaryEmployee(100, 'Michail', 'IT', 1000)
salaryEmployee.showmessage()
print(salaryEmployee)

externalPartner = ExternalPartner(200, 'George', 'Finance', 1500)
externalPartner.showmessage()
print(externalPartner)


         

Output


This is the Salary Employee
id=100, name=Michail, salary=1000, department=IT
This is the External Partner
id=200, name=George, salary=1500, department=Finance		
	 

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

Το να διαγράψουμε τον κώδικα της μεθόδου που κληρονομούμε είναι ένας τρόπος να χρησιμοποιήσουμε το ίδιο όνομα της μεθόδου. Όμως μπορεί να έχουμε και κάποιες περιπτώσεις στις οποίες δεν θέλουμε να διαγράψουμε εντελώς τον κώδικα της μεθόδου αλλά να προσθέσουμε έξτρα κώδικα στον αρχικό. Για να το κάνουμε αυτό, καλούμε την αρχική μέθοδο με την super( ) όπως δείχνει το παρακάτω παράδειγμα.

App.py


class Employee():

    def __init__(self, id, name, department):
        self.name = name
        self.id = id
        self.department = department

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

    def __str__(self):
        return f'id={self.id}, name={self.name}, salary={self.salary}, department={self.department}'

class SalaryEmployee(Employee):
    def __init__(self, id, name, department, monthlysalary):
        self.monthlysalary = monthlysalary
        super().__init__(id, name, department)

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

    def __str__(self):
        return f'id={self.id}, name={self.name}, salary={self.monthlysalary}, department={self.department}'

class ExternalPartner(Employee):
    def __init__(self, id, name, department, hourlysalary):
        self.hourlysalary = hourlysalary
        super().__init__(id, name, department)

    def showmessage(self):
        super().showmessage()
        print("This is the External Partner")

    def __str__(self):
        return f'id={self.id}, name={self.name}, salary={self.hourlysalary}, department={self.department}'

salaryEmployee = SalaryEmployee(100, 'Michail', 'IT', 1000)
salaryEmployee.showmessage()
print(salaryEmployee)

externalPartner = ExternalPartner(200, 'George', 'Finance', 1500)
externalPartner.showmessage()
print(externalPartner)

         

Output


This is the Employee
This is the Salary Employee
id=100, name=Michail, salary=1000, department=IT
This is the Employee
This is the External Partner
id=200, name=George, salary=1500, department=Finance
			
	 

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

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

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

loader