Dekoratory klasowe – nadaj swojemu kodowi Pythona klasy
Autor: Idego Group

Dekorator to zasadniczo funkcja, która przyjmuje inną funkcję i wykonuje dodatkową logikę w celu rozszerzenia lub modyfikacji zachowania oryginalnej funkcji. Zrozumienie dekoratorów wymaga znajomości funkcji pierwszej klasy i domknięć.
Gdy funkcja przyjmuje inną funkcję i może wykonywać pewną logikę przed nią lub po niej, pojawia się wzorzec dekoratora. Składnia @decorator_function to jedynie skrót dla original_function = decorator_function(original_function).
Dekoratory klasowe składają się z dwóch metod dunder: __init__() do tworzenia instancji dekoratora i obsługi parametrów oraz __call__() do wykonania po wywołaniu dekorowanego obiektu. Dekoratory klasowe oferują lepszą czytelność i wyraźniejsze oddzielenie między definicją dekoratora a logiką owijania w porównaniu z odpowiednikami opartymi na funkcjach.
Zalety dekoratorów są zgodne z zasadą DRY (Don't Repeat Yourself). Po utworzeniu dekoratory są wstecznie kompatybilne i nie wymagają modyfikacji wykonywanego kodu — co jest znaczącą zaletą przy jednoczesnej aktualizacji wielu metod.
Praktyczny przykład demonstruje dekorator @LogException, który obsługuje wyjątki, rejestrując je w plikach. Ten dekorator przyjmuje parametry takie jak nazwa pliku, tryb pliku i opcjonalna flaga znacznika czasu, pokazując, jak sparametryzowane dekoratory można dostosować do różnych scenariuszy. Dekorator elegancko opakowuje metody parsowania bez zmiany ich implementacji, umożliwiając ponowne wykorzystanie kodu w wielu funkcjach.