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