Umožňuje přidávat k funkci další funkcionalitu (její “obalení”)
Funkce vyššího řádu: funkce, která vrací funkci nebo ji bere jako argument
Syntaktický cukr
Demonstrací jednoduché funkcionality může být následující
Používání dekorátorů může způsobit na první pohled řadu komplikací, viz dále
Pokud dekorovaná funkce přijímá argumenty, případně má nějakou hodnotu vracet
Dále tzv. zachování identity funkce (např. dosažitelnost docstringu)
Dekorátory je možné zanořovat (vrstvit), avšak vždy zálěží na pořadí
Použití
Pro timming funkce (měření doby běhu), logování, autorizace či autentizace
Dekorátory tříd
Některé běžně používané jsou již “zabudované” v Pythonu (@classmethod, @staticmethod, …)
Kromě dekorování metod třídy, můžeme dekorovat i celou třídu
Tento přístup nedekoruje každou metodu třídy nýbrž se dekorátor aplikuje pouze při vytváření instance třídy
Speciální dekorátory ve třídách
@property
Jelikož nepoužíváme klasické gettery a settery může nastat situace, kdy budeme chtít dělat “něco navíc” při nastavení hodnoty (např. kontrola záporné hodnoty)
@classmethod
Tento dekorátor lze použít v situaci kdy je nutné metodám předat odkaz na celou třídu
Demonstrovat jej můžeme na příkladu metod from_*, tedy metod které umí vytvořit instanci třídy různými způsoby