Co to są dekoratory w Pythonie?

Dekoratory w Pythonie to potężna funkcjonalność, umożliwiająca modyfikację zachowania funkcji lub metod bez zmiany ich kodu źródłowego. Są one formą metaprogramowania, czyli techniki programowania, w której programy mają zdolność do traktowania innych programów jako swoich danych. W kontekście Pythona, dekoratory pozwalają na rozszerzanie i modyfikowanie funkcji dzięki wykorzystaniu wyższego rzędu funkcji (funkcji, które przyjmują inną funkcję jako argument i zwracają nową funkcję).

Przykład użycia dekoratora

Rozważmy przykład dekoratora, który mierzy czas wykonania dowolnej funkcji. To pomoże zrozumieć, jak dekoratory działają w praktyce oraz jak mogą być użyteczne w realnych zastosowaniach.

import time

# Dekorator do mierzenia czasu wykonania funkcji
def timing_decorator(function):
    # Funkcja wrapper, która dodaje logikę
    # pomiaru czasu do oryginalnej funkcji
    def wrapper(*args, **kwargs):
        start_time = time.time()  # Zapisanie czasu startu
        result = function(*args, **kwargs)  # Wywołanie
                                           # oryginalnej funkcji
        end_time = time.time()  # Zapisanie czasu zakończenia
        print(f"Funkcja {function.__name__} wykonana w: "
              f"{end_time - start_time:.4f} sekund.")
        return result
    return wrapper

# Przykład użycia dekoratora
@timing_decorator
def example_function(n):
    # Funkcja, której czas wykonania będzie mierzony
    sum = 0
    for i in range(n):
        sum += i
    return sum

# Wywołanie funkcji z dekoratorem
example_function(100000)

Wyjaśnienie kodu

  • Importujemy moduł time, aby móc mierzyć czas.
  • Definiujemy dekorator timing_decorator, który przyjmuje funkcję function jako argument.
  • Wewnątrz dekoratora znajduje się funkcja wrapper, która obejmuje oryginalną funkcję. wrapper używa *args i **kwargs do przekazania dowolnej liczby argumentów do oryginalnej funkcji.
  • Przed i po wywołaniu oryginalnej funkcji, wrapper mierzy czas, aby obliczyć, ile czasu zajęło wykonanie funkcji.
  • Ostatecznie, dekorator zwraca funkcję wrapper, która teraz zawiera logikę oryginalnej funkcji wraz z dodatkowym kodem do mierzenia czasu.
  • Używamy dekoratora poprzez przedrostek @timing_decorator przed definicją funkcji, której działanie chcemy zmodyfikować. W naszym przykładzie jest to example_function, funkcja sumująca liczby od 0 do n.
  • Po wywołaniu example_function(100000), oprócz oczekiwanego wyniku działania funkcji, otrzymamy również informację o czasie jej wykonania.

Podsumowanie

Dekoratory są niezwykle użytecznym narzędziem w Pythonie, pozwalającym na czyste i wygodne rozszerzanie funkcjonalności funkcji bez potrzeby zmiany ich pierwotnego kodu. Umożliwiają one dodawanie wspólnych fragmentów kodu, takich jak logowanie, mierzenie wydajności, sprawdzanie uprawnień i wiele innych, w sposób, który jest zarówno estetyczny, jak i łatwy do ponownego użycia.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs Python od podstaw w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top