Decorators στην Python

Python Οδηγός - Μάθημα 19: Decorators στην Python

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

Οι decorators χρησιμοποιούνται για να τροποποιήσουν ή να προσθέσουν χαρακτηριστικά στις συναρτήσεις με έναν πιο "καθαρό" και επαναχρησιμοποιήσιμο τρόπο.

Πώς Λειτουργούν οι Decorators:

Οι decorators είναι συναρτήσεις που παίρνουν άλλες συναρτήσεις ως παράμετρο και επιστρέφουν μια νέα συνάρτηση. Αυτή η νέα συνάρτηση μπορεί να κάνει κάτι πριν ή μετά από την εκτέλεση της αρχικής συνάρτησης, ή ακόμη και να την αντικαταστήσει εντελώς.

Βήματα:

  1. Η συνάρτηση decorator δέχεται μια άλλη συνάρτηση ως όρισμα.
  2. Επιστρέφει μια νέα συνάρτηση που τροποποιεί ή επεκτείνει την αρχική συνάρτηση.
  3. Η νέα συνάρτηση εκτελεί την αρχική συνάρτηση και στη συνέχεια προσθέτει επιπλέον λειτουργικότητα.

Παράδειγμα 1: Βασικός Decorator

# Ορίζουμε τον decorator def decorator_function(original_function): def wrapper_function(): print("Η συνάρτηση εκτελείται πριν από την αρχική συνάρτηση.") original_function() # Καλούμε την αρχική συνάρτηση print("Η συνάρτηση εκτελείται μετά την αρχική συνάρτηση.") return wrapper_function # Ορίζουμε την συνάρτηση που θα διακοσμήσουμε def display(): print("Η αρχική συνάρτηση εκτελείται.") # Χρησιμοποιούμε τον decorator decorated_display = decorator_function(display) # Εκτελούμε την διακοσμημένη συνάρτηση decorated_display()

Αποτέλεσμα:

Η συνάρτηση εκτελείται πριν από την αρχική συνάρτηση. Η αρχική συνάρτηση εκτελείται. Η συνάρτηση εκτελείται μετά την αρχική συνάρτηση.

Παράδειγμα 2: Χρήση @ για Διακοσμητές

Μπορούμε να χρησιμοποιήσουμε τη σύνταξη @ για να εφαρμόσουμε τον decorator με πιο εύκολο και πιο καθαρό τρόπο.

# Ορίζουμε τον decorator def decorator_function(original_function): def wrapper_function(): print("Η συνάρτηση εκτελείται πριν από την αρχική συνάρτηση.") original_function() # Καλούμε την αρχική συνάρτηση print("Η συνάρτηση εκτελείται μετά την αρχική συνάρτηση.") return wrapper_function # Χρησιμοποιούμε τον decorator με τη σύνταξη @ @decorator_function def display(): print("Η αρχική συνάρτηση εκτελείται.") # Εκτελούμε την διακοσμημένη συνάρτηση display()

Αποτέλεσμα:

Η συνάρτηση εκτελείται πριν από την αρχική συνάρτηση. Η αρχική συνάρτηση εκτελείται. Η συνάρτηση εκτελείται μετά την αρχική συνάρτηση.

Όταν χρησιμοποιούμε @decorator_function πάνω από την συνάρτηση display, ο decorator εφαρμόζεται αυτόματα στην display και κάνει τις αλλαγές που καθορίζονται στην wrapper_function.

Παράδειγμα 3: Decorator με Παράμετρο

Μπορούμε να δημιουργήσουμε decorators που δέχονται παραμέτρους και να τις περάσουμε στην αρχική συνάρτηση.

def decorator_with_args(func): def wrapper(*args, **kwargs): print("Ο decorator εκτελείται πριν από τη συνάρτηση.") return func(*args, **kwargs) return wrapper @decorator_with_args def greet(name): print(f"Γειά σου, {name}!") greet("Γρηγόριος")

Αποτέλεσμα:

Ο decorator εκτελείται πριν από τη συνάρτηση. Γειά σου, Γρηγόριος!

Στο παράδειγμα αυτό, ο decorator_with_args μπορεί να δεχτεί παραμέτρους και να τις περάσει στην αρχική συνάρτηση greet.

Παράδειγμα 4: Chaining Decorators

Μπορούμε να χρησιμοποιήσουμε πολλούς decorators σε μία μόνο συνάρτηση. Αυτός ο τύπος διακόσμησης ονομάζεται "chaining decorators".

def decorator_one(func): def wrapper(): print("Decorator 1: Εκτελείται πριν την αρχική συνάρτηση.") func() print("Decorator 1: Εκτελείται μετά την αρχική συνάρτηση.") return wrapper def decorator_two(func): def wrapper(): print("Decorator 2: Εκτελείται πριν την αρχική συνάρτηση.") func() print("Decorator 2: Εκτελείται μετά την αρχική συνάρτηση.") return wrapper @decorator_one @decorator_two def display(): print("Η αρχική συνάρτηση εκτελείται.") display()

Αποτέλεσμα:

Decorator 1: Εκτελείται πριν την αρχική συνάρτηση. Decorator 2: Εκτελείται πριν την αρχική συνάρτηση. Η αρχική συνάρτηση εκτελείται. Decorator 2: Εκτελείται μετά την αρχική συνάρτηση. Decorator 1: Εκτελείται μετά την αρχική συνάρτηση.

Στο παραπάνω παράδειγμα, χρησιμοποιούμε δύο decorators σε αλυσιδωτό στυλ. Το decorator_two εφαρμόζεται πρώτα και στη συνέχεια το decorator_one εφαρμόζεται στο αποτέλεσμα.

Συμπέρασμα

Οι decorators στην Python είναι ένας ισχυρός τρόπος να τροποποιήσουμε ή να προσθέσουμε συμπεριφορές σε υπάρχουσες συναρτήσεις χωρίς να χρειαστεί να τροποποιήσουμε τον αρχικό κώδικα της συνάρτησης. Χρησιμοποιούνται συχνά σε βιβλιοθήκες και πλαίσια (όπως το Flask ή το Django) για να προσθέσουν επιπλέον λειτουργικότητες, όπως η διαχείριση της εξουσιοδότησης χρηστών ή η παρακολούθηση των αιτήσεων.

Σχόλια

Δημοφιλείς αναρτήσεις από αυτό το ιστολόγιο

Αυτόματο Φως Νύχτας

🚀 Διαγωνισμός Ρομποτικής & Αυτοματισμού! 🤖

🚗🤖 Φτιάξε το Δικό σου Μίνι Ρομποτικό Αυτοκίνητο με Arduino!