Spis treści

Dekoratory – temat często spotykany na forach internetowych i w książkach związanych z programowaniem w języku python. Początkujący programiści zwykle mają z nim problem, ale nawet część zaawansowanych programistów piszących w pythonie od dłuższego czasu, nie wie skąd w pythonie wzięły się dekoratory. Zacznijmy od małego wstępu. Za wikipedią: “Dekorator – wzorzec projektowy należący do grupy wzorców strukturalnych. Pozwala na dodanie nowej funkcji do istniejących klas dynamicznie podczas działania programu. Wzorzec dekoratora polega na opakowaniu oryginalnej klasy w nową klasę „dekorującą”. Zwykle przekazuje się oryginalny obiekt jako parametr konstruktora dekoratora, metody dekoratora wywołują metody oryginalnego obiektu i dodatkowo implementują nową funkcję.” Brzmi to dość skomplikowanie, jednak po głębszej analizie wszystko okazuje się jasne.

Dekorator w Phyton

Dekorator jest elementram rozszerzającym klasę (funkcję) o nowe funkcjonalności. Najprostrzym do zobrazowania przykładem jest sprawdzanie czy użytkownik jest zalogowany do systemu. Zamiast sprawdzać w każdej wywoływanej funkcji czy użytkownik jest zalogowany, możemy wykorzystać do tego dekorator I rozszerzyć funkcjonalność o sprawdzanie czy użytkownik jest poprawnie zalogowany. Z takimi dekoratorami można spotkać się często w webowych frameworkach np. Flask, Django. Jak wygląda dekorowanie w pythonie? Dekorowanie funkcji w pythonie sprowadza się do “opakowania” jej w inną funkcję. Funkcje w pythonie są obiektami pierwszego rzędu. Oznacza to, że można traktować je jak, każde inne obiekty I przesyłać np. w argumentach innych funkcji. Przykład:

def funkcja_dekorujaca(funkcja_dekorowana): #definicja dekoratora funkcja_dekorowana.atrybut = True return funkcja_dekorowana

Powyżej zdefiniowaliśmy dekorator. Dla każdej funkcji, na której go użyjemy atrybut “atrybut’ zostanie ustawiony na True. Przykład użycia dekoratora:

def funkcja(): return 1

funkcja = funkcja_dekorujaca(funkcja) # użycie dekoratora

Nadszedł czas na tak zwany lukier składniowy. Poniżej przedstawiono zabieg pozwalający bardzo szybko I przyjemnie dekorować nowe funkcje.

@funkcja_dekorujaca def funkcja(): return 1

Powyższy zapis realizuje dokładnie to samo zadanie co pierwszy przykład użycia dekoratora. Mam nadzieję, że teraz tajemnicze zapisy nad funkcjami poprzedzone małpami staną się zrozumiałe dla początkujących programistów frameworków webowych, gdzie ostatnimi czasy dekoratory pojawiają się na każdym kroku.

Sławomir Wawrzyniak