5.1 Poznanie dekoratorów
Dekoratory to funkcje, które przyjmują inną funkcję jako argument i zwracają nową funkcję, zmieniając lub rozszerzając zachowanie pierwotnej funkcji. Dekoratory są używane do zwiększenia czytelności i ponownego wykorzystania kodu.
Dekoratory pozwalają modyfikować zachowanie funkcji lub metod bez zmiany ich pierwotnego kodu. Dlatego są szeroko stosowane do dodawania funkcjonalności, logowania, kontrolowania dostępu i wielu innych zadań.
Składnia dekoratorów w Pythonie obejmuje użycie symbolu @ przed nazwą dekoratora, który umieszcza się przed definicją funkcji.
@decorator
def my_function():
pass
To jest równoważne z następującym kodem:
def my_function():
pass
my_function = decorator(my_function)
Zastanów się dobrze, co tu się dzieje: deklarujemy funkcję my_function, ale potem zastępujemy ją funkcją decorator, do której jako parametr przekazujemy naszą funkcję. Funkcja decorator może wywołać naszą funkcję według własnego wyboru.
5.2 Tworzenie prostego dekoratora
Rozważmy prosty dekorator, który wyświetla komunikat przed i po wywołaniu funkcji.
def my_decorator(func):
def wrapper():
print("Przed wywołaniem funkcji")
func()
print("Po wywołaniu funkcji")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Wyjaśnienie
Dekorator (my_decorator): Ta funkcja przyjmuje funkcję func jako argument i zwraca nową funkcję wrapper, która wywołuje func i dodaje dodatkowe zachowanie przed i po jej wywołaniu.
Funkcja z dekoratorem (say_hello): Funkcja say_hello jest opakowana dekoratorem my_decorator, co dodaje dodatkowe zachowanie podczas jej wywołania.
Wynik:
# Przed wywołaniem funkcji
Hello!
# Po wywołaniu funkcji
5.3 Dekoratory z argumentami
Dekoratory mogą przyjmować argumenty, co pozwala na elastyczne dostosowywanie ich zachowania.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
Wyjaśnienie
Dekorator z argumentami (repeat): Ta funkcja przyjmuje argument num_times i zwraca dekorator decorator_repeat.
Dekorator (decorator_repeat): Ten dekorator przyjmuje funkcję func i zwraca nową funkcję wrapper, która wywołuje func num_times razy.
Funkcja z dekoratorem (say_hello): Funkcja say_hello jest wywołana trzy razy dzięki dekoratorowi repeat.
Wynik:
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION