Dekoratory w Pythonie to potężne narzędzie, pozwalające programistom modyfikować zachowanie funkcji lub metod bez zmieniania ich kodu. Łańcuchowanie dekoratorów pozwala na stosowanie wielu dekoratorów do jednej funkcji, co zwiększa elastyczność i możliwości reużywalności kodu. W tym artykule przyjrzymy się, jak działa łańcuchowanie dekoratorów i przedstawimy przykład użycia tej techniki.
Kompletny przykład kodu z komentarzami
Zacznijmy od przygotowania dwóch prostych dekoratorów, które zmieniają sposób działania funkcji poprzez dodanie dodatkowego tekstu przed i po jej wywołaniu.
def decorator_outer(func):
# Dekorator zewnętrzny dodający tekst przed
def wrapper():
print("Tekst przed wykonaniem funkcji")
func()
print("Tekst po wykonaniu funkcji")
return wrapper
def decorator_inner(func):
# Dekorator wewnętrzny dodający inny tekst
def wrapper():
print("Rozpoczynam działanie funkcji")
func()
print("Zakończyłem działanie funkcji")
return wrapper
@decorator_outer
@decorator_inner
def greet():
# Funkcja, do której stosujemy dekoratory
print("Witaj, świecie!")
greet()
W powyższym kodzie zdefiniowaliśmy dwie funkcje dekorujące: decorator_outer
i decorator_inner
. Następnie zastosowaliśmy je jako dekoratory do funkcji greet
poprzez umieszczenie przed nią dwóch instrukcji @decorator_name
. Kolejność dekoratorów jest istotna – dekorator umieszczony bliżej nazwy funkcji (w tym przypadku @decorator_inner
) zostanie wykonany jako pierwszy.
Jak to działa?
Dekoratory działają przez otoczenie oryginalnej funkcji nową funkcją (wrapperem), co pozwala na wykonanie dodatkowego kodu przed i po wywołaniu oryginalnej funkcji. W naszym przykładzie, kiedy wywołujemy greet()
, najpierw uruchamiany jest kod z decorator_inner
, a następnie decorator_outer
. Pozwala to na eleganckie dodanie przed i po wykonaniu funkcji greet
dodatkowych instrukcji bez ingerencji w jej kod.
Podsumowanie
Łańcuchowanie dekoratorów w Pythonie umożliwia efektywne rozszerzanie funkcjonalności funkcji lub metod. Przez stosowanie wielu dekoratorów, programiści mogą tworzyć bardziej złożone zachowania w sposób modularny i reużywalny. Warto jednak pamiętać, że nadmiarne używanie tej techniki może uczynić kod trudniejszym do zrozumienia, dlatego zaleca się stosowanie dekoratorów tam, gdzie naprawdę poprawiają one klarowność i jakość kodu.
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.