Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

Διακοσμητές


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

python @decorator def function(arg): return "value"

είναι ισοδύναμη με:

python def function(arg): return "value" function = decorator(function) # περνά τη συνάρτηση στον decorator και την επανατοποθετεί στη συνάρτηση

Όπως ίσως έχετε δει, ένας decorator είναι απλά μια άλλη συνάρτηση που παίρνει μια συνάρτηση και επιστρέφει μία. Για παράδειγμα θα μπορούσατε να κάνετε αυτό:

python def repeater(old_function): def new_function(*args, **kwds): # Δείτε learnpython.org/en/Multiple%20Function%20Arguments για το πώς λειτουργεί το *args και το **kwds old_function(*args, **kwds) # εκτελούμε την παλιά συνάρτηση old_function(*args, **kwds) # την εκτελούμε δύο φορές return new_function # πρέπει να επιστρέψουμε τη νέα συνάρτηση, αλλιώς δεν θα επανατοποθετηθεί στην τιμή

Αυτό θα έκανε μια συνάρτηση να εκτελείται δύο φορές.

```python

@repeater def multiply(num1, num2): print(num1 * num2)

multiply(2, 3) 6 6 ```

Μπορείτε επίσης να κάνετε να αλλάξει το αποτέλεσμα

python def double_out(old_function): def new_function(*args, **kwds): return 2 * old_function(*args, **kwds) # τροποποιεί την επιστρεφόμενη τιμή return new_function

να αλλάξει την είσοδο

python def double_Ii(old_function): def new_function(arg): # λειτουργεί μόνο αν η παλιά συνάρτηση έχει ένα επιχείρημα return old_function(arg * 2) # τροποποιεί το επιχείρημα που περνάει return new_function

και να κάνει έλεγχο.

python def check(old_function): def new_function(arg): if arg < 0: raise (ValueError, "Negative Argument") # Αυτό προκαλεί ένα σφάλμα, το οποίο είναι καλύτερο από το να κάνει το λάθος πράγμα old_function(arg) return new_function

Ας πούμε ότι θέλετε να πολλαπλασιάσετε το αποτέλεσμα με μια μεταβλητή ποσότητα. Θα μπορούσατε να ορίσετε τον decorator και να το χρησιμοποιήσετε ως εξής:

python def multiply(multiplier): def multiply_generator(old_function): def new_function(*args, **kwds): return multiplier * old_function(*args, **kwds) return new_function return multiply_generator # επιστρέφει το νέο generator

Χρήση

python @multiply(3) # πολλαπλάσιο δεν είναι generator, αλλά το multiply(3) είναι def return_num(num): return num

Τώρα το return_num είναι διακοσμημένο και επανατοποθείται στον εαυτό του

python return_num(5) # θα πρέπει να επιστρέψει 15

Μπορείτε να κάνετε οτιδήποτε θέλετε με την παλιά συνάρτηση, ακόμα και να την αγνοήσετε εντελώς! Οι προχωρημένοι decorators μπορούν επίσης να χειριστούν το doc string και τον αριθμό των επιχειρημάτων. Για μερικους εντυπωσιακούς decorators, επισκεφθείτε το http://wiki.python.org/moin/PythonDecoratorLibrary.

Άσκηση

Δημιουργήστε ένα εργοστάσιο decorators που επιστρέφει έναν decorator ο οποίος διακοσμεί συναρτήσεις με ένα επιχείρημα. Το εργοστάσιο πρέπει να παίρνει ένα επιχείρημα, έναν τύπο, και στη συνέχεια να επιστρέφει έναν decorator που να ελέγχει αν η είσοδος είναι του σωστού τύπου. Αν είναι λάθος, πρέπει να εκτυπώνει("Bad Type") (Στην πραγματικότητα, θα πρέπει να προκαλεί ένα σφάλμα, αλλά η πρόκληση σφαλμάτων δεν είναι σε αυτό το εκπαιδευτικό μάθημα). Δείτε τον κώδικα του tutorial και το αναμενόμενο αποτέλεσμα για να δείτε τι είναι αν μπερδευτείτε (ξέρω ότι θα μπερδευόμουν). Η χρήση του isinstance(object, type_of_object) ή του type(object) μπορεί να βοηθήσει.

def type_check(correct_type): #put code here @type_check(int) def times2(num): return num*2 print(times2(2)) times2('Not A Number') @type_check(str) def first_letter(word): return word[0] print(first_letter('Hello World')) first_letter(['Not', 'A', 'String']) def type_check(correct_type): def check(old_function): def new_function(arg): if (isinstance(arg, correct_type)): return old_function(arg) else: print("Bad Type") return new_function return check @type_check(int) def times2(num): return num*2 print(times2(2)) times2('Not A Number') @type_check(str) def first_letter(word): return word[0] print(first_letter('Hello World')) first_letter(['Not', 'A', 'String']) test_output_contains("4") test_output_contains("Bad Type") test_output_contains("H") test_output_contains("Bad Type") success_msg("Good job!")

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy