Αρχικός ορισμός:
Οι decorators είναι συναρτήσεις που δέχονται ως όρισμα (argument) μία συνάρτηση (function) και "επιστρέφουν" μία άλλη συνάρτηση.
Αυτό μπορεί να γίνει στην python γιατί το καθετί (και άρα και οι συναρτήσεις) είναι object, και μπορούμε να περάσουμε οποιοδήποτε object ως όρισμα σε μία συνάρτηση.
Ένα απλό παράδειγμα είναι το εξής:
def decorator(func):
def wrapper(arg):
# Πριν κάνει κάτι η συνάρτηση func, τύπωσε κάτι στην οθόνη
print("Καλώ την συνάρτηση {}...".format(func.__name__))
func(arg)
# Αφού τελειώσει η συνάρτηση, τύπωσε κάτι άλλο
print("Τέλος συνάρτησης {}.".format(func.__name__))
return wrapper
Και τον χρησιμοποιώ ως εξής:
def myFunction(arg):
pass
myFunction = decorator(myFunction)
Το παραπάνω η python μας επιτρέπει να το γράψουμε για ευκολία και ως εξής:
@decorator
def myFunction(arg):
pass
Οι παραπάνω 2 τρόποι είναι απολύτως ισοδύναμοι. Ο δεύτερος αποτελεί απλώς
syntactic sugar για τον πρώτο.
Μίλησα για συναρτήσεις στην αρχή, αλλά όλα τα παραπάνω μπορούν να εφαρμοστούν και για κλάσεις (classes) και, γενικά, για
οποιοδήποτε callable αντικείμενο. Έτσι τελικά ο ορισμός του decorator στην python (χωρίς να είμαι και ειδικός στο θέμα) θα ήταν μάλλον ο εξής:
Οι decorators είναι callables που δέχονται ως όρισμα ένα callable και "επιστρέφουν" ένα άλλο callable.