Košík je prázdný

Dekorátory v Pythonu jsou mocným nástrojem, který umožňuje programátorům měnit chování funkcí nebo metod bez nutnosti jejich přepisování. V podstatě jde o funkce, které obalují jinou funkci a mohou tak před jejím spuštěním nebo po něm vykonávat dodatečné operace. Tento článek vám představí, jak dekorátory fungují a jak je můžete využívat ve svých programech.

Základní použití dekorátorů

Nejprve si ukážeme, jak vypadá základní dekorátor. Představte si, že máme funkci, kterou chceme změřit dobu běhu. Místo toho, abychom do každé funkce přidávali kód pro měření času, můžeme vytvořit dekorátor:

import time

def casovy_dekorator(funkce):
    def obalena_funkce(*args, **kwargs):
        zacatek = time.time()
        vysledek = funkce(*args, **kwargs)
        konec = time.time()
        print(f"Funkce {funkce.__name__} trvala {konec - zacatek} sekund.")
        return vysledek
    return obalena_funkce

@casovy_dekorator
def nejaka_funkce():
    time.sleep(2)

nejaka_funkce()

V tomto příkladu @casovy_dekorator je dekorátor, který měří dobu běhu funkce nejaka_funkce a vypíše ji.

Pokročilé použití dekorátorů

Dekorátory nejsou omezeny pouze na jednoduché úpravy chování funkce. Mohou také provádět složitější úpravy, jako je přidávání argumentů, ověřování vstupů, cachování výsledků a mnoho dalších.

Příklad dekorátoru pro cachování výsledků:

def cache_dekorator(funkce):
    cache = {}
    def obalena_funkce(*args):
        if args in cache:
            return cache[args]
        vysledek = funkce(*args)
        cache[args] = vysledek
        return vysledek
    return obalena_funkce

@cache_dekorator
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

V tomto příkladě dekorátor cache_dekorator ukládá výsledky volání funkce fibonacci do cache, což výrazně zvyšuje její výkon při opakovaných voláních s týmiž argumenty.

Vlastní dekorátory s argumenty

Někdy potřebujeme, aby dekorátor přijímal vlastní argumenty. Toho lze dosáhnout vytvořením další vrstvy funkce, která bude argumenty dekorátoru zachytávat:

def dekorator_s_argumentem(argument):
    def skutecny_dekorator(funkce):
        def obalena_funkce(*args, **kwargs):
            # Zde můžeme využít 'argument'
            print(f"Dekorátor s argumentem {argument}")
            return funkce(*args, **kwargs)
        return obalena_funkce
    return skutecny_dekorator

@dekorator_s_argumentem("příklad")
def funkce():
    print("Toto je test.")

funkce()

Výše uvedený kód ukazuje, jak můžeme vytvořit dekorátor, který přijímá argumenty a používá je při vykonávání obalené funkce.

 

Dekorátory v Pythonu jsou velmi flexibilní nástroj, který umožňuje efektivně rozšiřovat a modifikovat chování funkcí a metod. Ačkoliv může být jejich syntaxe na první pohled matoucí, poskytují významnou hodnotu pro pokročilé programování a návrhové vzory. Doufáme, že tento článek vám poskytl solidní základ pro práci s dekorátory ve vašich Python projektech.