Python

ΕΝΟΤΗΤΑ 23 - Hiding Attributes

image description

Στο σημερινό δωρεάν μάθημα Python, θα δούμε πως να κρύβουμε τις μεταβλητές σε μια κλάση έτσι ώστε μόνο μέσω των setter και getter μεθόδων να μπορούμε να επηρεάσουμε τις τιμές τους.

Όπως ήδη γνωρίζετε από τις προηγούμενες ενότητες, το σενάριο με το οποίο ασχολούμαστε είναι η δημιουργία μιας εφαρμογής η οποία περιγράφει προγραμματιστικά τον εργαζόμενο μιας οποιαδήποτε εταιρείας. Για να υλοποιήσουμε το σενάριο μας, δημιουργήσαμε μια κλάση με μεταβλητές όπως name και salary και μετά προσθέσαμε μεθόδουs όπως setSalary( ) και getSalary( ) για να μπορέσουμε να ελέγξουμε τις τιμές πριν τις αναθέσουμε στις μεταβλητές. Μάλιστα, στην getSalary( ) έχουμε θέσει έναν όρο όπου μόνο μισθοί ανάμεσα σε 0 και 20000 θα είναι αποδεκτοί. Όμως το πρόγραμμα μας δεν προστατεύεται όπως πραγματικά θα επιθυμούσαμε, γιατί αν και μπορούμε να θέσουμε τιμές για την μεταβλητή salary μέσω των setSalary( ) και getSalary( ) μπορούμε ταυτόχρονα κατευθείαν να επηρεάσουμε την τιμή της μεταβλητής salary.

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

App.py


class Employee():

    def __init__(self, name, id=0):
        self.name = name
        self.id = id
        self.salary = 0
        self.age = 30

    def paySalary(self):
        print(f'A check will be sent to {self.name}')

    def companyInformation():
        print('All employees are working for the company ABC')

    def vacationCalc(self, daysTotal, daysRequested):
        remainingDays = daysTotal - daysRequested
        print("You have requested", daysRequested, "days of vacation")
        print("You have", remainingDays, "of vacation left")

    def setSalary(self, salary):
        if salary>0 and salary<2000:
            self.salary = salary
        else:
            print("This salary amount is not acceptable")

    def getSalary(self):
        print(f'Your current salary is {self.salary}')

    def employeeBirthday(self):
        self.age +=1

    def getAge(self):
        print(f'your age is {self.age}')

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

mike = Employee("Michail", 100)
mike.setSalary(10000)
mike.getSalary()
print(mike.salary)
mike.salary=30000
print(mike.salary)

         

Output


This salary amount is not acceptable
Your current salary is 0
0
30000

	 

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

Για να μετατρέψουμε μια μεταβλητή από public σε private δεν έχουμε παρά να προσθέσουμε δύο underscore παύλες (__) μπροστά από την μεταβλητή.

Στο παρακάτω παράδειγμα, έχουμε αλλάξει την μεταβλητή salary σε private (__salary). Δίνουμε την τιμή 1000 στην setSalary( ) για να ορίσουμε την τιμή της __salary. Η τιμή είναι αποδεκτή γιατί είναι μικρότερη από 2000. Μετά καλούμε την getSalary( ) για να δούμε ποια είναι η τιμή της __salary. Και πραγματικά λαμβάνουμε πίσω 1000. Όταν όμως προσπαθούμε να αλλάξουμε την τιμή της __salary κατευθείαν λαμβάνουμε λάθος.

App.py


class Employee():

    def __init__(self, name, id=0):
        self.name = name
        self.id = id
        self.__salary = 0
        
        self.age = 30

    def paySalary(self):
        print(f'A check will be sent to {self.name}')

    def companyInformation():
        print('All employees are working for the company ABC')

    def vacationCalc(self, daysTotal, daysRequested):
        remainingDays = daysTotal - daysRequested
        print("You have requested", daysRequested, "days of vacation")
        print("You have", remainingDays, "of vacation left")

    def setSalary(self, salary):
        if salary>0 and salary<2000:
            self.__salary = salary
        else:
            print("This salary amount is not acceptable")

    def getSalary(self):
        print(f'Your current salary is {self.__salary}')

    def employeeBirthday(self):
        self.age +=1

    def getAge(self):
        print(f'your age is {self.age}')

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

mike = Employee("Michail", 100)
mike.setSalary(1000)
mike.getSalary()
print(mike.__salary)
mike.__salary=30000
print(mike.__salary)

         

Output


Your current salary is 1000       
Traceback (most recent call last):
File "c:\Users\michail.kassapoglou\Desktop\FastAPI\pythonpractice\app.py", 
		line 43, in <module>
		print(mike.__salary)
AttributeError: 'Employee' object has no attribute '__salary'
	
	
	 

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

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

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

loader