Dekoratory

Python SELF PL
Poziom 14 , Lekcja 1
Dostępny

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!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION