Python

ΕΝΟΤΗΤΑ 28 - Static Methods and Class Methods

image description

Στο σημερινό δωρεάν μάθημα Python θα ασχοληθούμε με τις Static Methods και τις Class Methods. Κάθε μια από αυτή την κατηγορία μεθόδων λειτουργούν διαφορετικά αλλά κάθε μια έχει και τα αντίστοιχα πλεονεκτήματα μας προσφέρει.

Μέχρι τώρα έχουμε μιλήσει για τα instance methods δηλαδή εκείνα τα methods τα οποία δημιουργούμε μέσα σε μια κλάση και μπορούμε να τις καλέσουμε αφού δημιουργήσουμε πρώτα ένα αντικείμενο. Ένα απλό παράδειγμα των Instance methods είναι το εξής:

App.py


class Employee():

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

michail = Employee()
michail.showmessage()

         

Output


This is the Employee	
	 

Static methods είναι πολύ κοντά σε λειτουργία με τις instance methods με την διαφορά ότι δεν χρησιμοποιούμε το self μέσα στην παρένθεση. Αυτό δηλώνει ότι η method ανήκει στην κλάση και όχι στο αντικείμενο που θα δημιουργηθεί από την κλάση. Με άλλα λόγια, για να καλέσουμε μια static method δεν θα δημιουργήσουμε αντικείμενο από την κλάση, αλλά θα γράψουμε το όνομα της κλάσης και μετά το όνομα της μεθόδου. Συνήθως δεν χρησιμοποιούμε πολύ την λογική των static methods, αν όμως το κάνουμε είναι γιατί θέλουμε να μαζέψουμε σε ένα module όλες εκείνες τις μεθόδους που ίσως εκτελούν κάποιες μονωμένες πράξεις και θέλουμε να τις καλέσουμε χωρίς να δημιουργήσουμε αντικείμενο.

Για να ορίσουμε μια μέθοδο σαν static θα πρέπει να γράψουμε πριν από την μέθοδο το @staticmethod decorator. Δεν χρειάζεται να μιλήσουμε με πολλές λεπτομέρειες για τους decorators γιατί θα το κάνουμε σε μελλοντική ενότητα. Για τώρα απλά πρέπει να γνωρίζετε ότι για να οριστεί μια μέθοδο σαν static θα πρέπει να γράψουμε το @staticmethod πριν από την μέθοδο.

App.py


class Employee():

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

    @staticmethod
    def method():
        print("I am the static method")

michail = Employee()
Employee.method()

         

Output


I am the static method	
	 

Τώρα αν αναρωτιέστε που ακριβώς είναι χρήσιμες οι static methods, η απάντηση που θα πάρετε από τους περισσότερους προγραμματιστές είναι ότι μπορούν να χρησιμοποιηθούν σαν utilities σε άλλες μεθόδους.

Στο παρακάτω πρόγραμμα, έχουμε δημιουργήσει μια κλάση με το όνομα Employee. Μέσα στην κλάση έχουμε ορίσει δυο μεθόδους – show_birthday() και show_anniversary( ) αντίστοιχα, που η κάθε μια ξεχωριστά εμφανίζει το δικό της μήνυμα όταν καλεστεί μέσα στον κώδικα.

App.py


import datetime

class Employee():
	def __init__(self, birthday, anniversary):
		self.birthday = birthday
		self.anniversary = anniversary

	def show_birthday(self):
		print(f"Birth day is on: {self.birthday}")

	def show_anniversary(self):
		print( f"Anniversary day is on: {self.anniversary}")

michail = Employee(datetime.date(1990, 3, 14), datetime.date(2021, 12, 25))
michail.show_birthday()
michail.show_anniversary()
	
         

Output


Birth day is on: 1990-03-14
Anniversary day is on: 2021-12-25
		
	 

Αντί λοιπόν να έχουμε ξεχωριστά format μηνυμάτων σε κάθε μέθοδο, μπορούμε να ορίσουμε μια και μόνο μέθοδο μέσα στην οποία απλά θα περνάμε την ημερομηνία και εκείνη θα μας την εμφανίζει. Μια τέτοια μέθοδο μπορεί να είναι static όπως δείχνει και το παρακάτω παράδειγμα.

App.py


import datetime

class Employee():
	def __init__(self, birthday, anniversary):
		self.birthday = birthday
		self.anniversary = anniversary

	@staticmethod
	def format_date(date):
		print(date.strftime('%d-%b-%y'))

	def show_birthday(self):
		return Employee.format_date(self.birthday)

	def show_anniversary(self):
		return Employee.format_date(self.anniversary)

michail = Employee(datetime.date(1990, 3, 14), datetime.date(2021, 12, 25))
michail.show_birthday()
michail.show_anniversary()

         

Output


14-Mar-90
25-Dec-21
	 

Ας προχωρήσουμε τώρα να δούμε τι διαφορετικό έχουν να προσφέρουν οι class methods. Οι class methods είναι παρόμοιες με τις instance methods εκτός από το γεγονός ότι αντί για self θα περνάμε την κλάση σαν παράμετρο. Και εδώ, όπως και στις static methods, θα πρέπει να χρησιμοποιήσουμε ένα decorator αυτή τη φορά με το όνομα @classmethod. Το μεγαλύτερο πλεονέκτημα που έχει να μας προσφέρει μια class method είναι η δυνατότητα να μας επιστρέφει αντικείμενο.

Σκεφτείτε το εξής παράδειγμα, για να καταλάβετε καλύτερα την έννοια του class method. Ας θεωρήσουμε ότι έχουμε μια κλάση με το όνομα Employee. Μπορούμε να δημιουργήσουμε ένα αντικείμενο αφού εισάγουμε το όνομα τoυ εργαζόμενου, το τμήμα του, και τον μισθό του σε δολάρια. Επειδή όμως το γεγονός να εισάγουμε τον μισθό σε δολάρια ίσως να μην είναι και πολύ εύκολο, τότε σαν εναλλακτική επιλογή μπορούμε να χρησιμοποιήσουμε μια class method που διαβάζει τα δεδομένα που έχει εισάγει ο χρήστης και αφού μετατρέψει τα δολάρια σε ευρώ, να δημιουργεί το αντικείμενο.

App.py


class Employee():
    def __init__(self, name, title, salary):
        self.name = name
        self.title = title
        self.salary = salary

    @classmethod
    def convert_money(cls, name, title, salary):
        salary = salary * 0.84
        return cls(name, title, salary)

michail = Employee.convert_money('Michail Kassapoglou', 'IT', 1000)
print(michail.salary)

         

Output


840.0
	 

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

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

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

loader