Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 18. diel - Dekorátory druhýkrát - Parametrické a triedne dekorátory

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Tomas Hrdlicka:11.8.2024 11:01

vážně by to chtělo asi ještě detailnější vysvětlení, takhle budu doufat, že bude dost prostoru na školené

Avatar
honza394
Člen
Avatar
honza394:15.8.2024 8:55

Ahoj, dávám podnět na opravu poznámky pod posledním kódem.
dekorator_s_parametry("pozdrav")(pozdrav)() vrací

Mám tě pozdravit.
Mám tě pozdravit.
Ahoj!
Tak jsem pozdravil.
Tak jsem pozdravil.

zatímco dekorator_s_parametry("pozdrav")(pozdrav()) vrací to, co jsme chtěli:

Mám tě pozdravit.
Ahoj!
Tak jsem pozdravil.
Avatar
Odpovedá na honza394
Ladislav Schnaiberg:5.10.2024 22:41

vyzkoušel jsem a zdá se, že skutečně má být voláno

dekorator_s_parametry("pozdrav")(pozdrav)()

proč to tvrdím můžete odzkoušet na kódu, kde je dekorátor a dekorovaná funkce pojmenovaná jinak než bylo původně v případě dekorace

"""
Volání pozdrav() lze bez použití
@dekorator_s_parametry("pozdrav") nahradit zápisem
dekorator_s_parametry("pozdrav")(pozdrav)(). Když každý
náš vytvořený dekorátor dokážeme zapsat i tímto způsobem, je
to dobrá známka toho, že problematice dobře rozumíme.
"""

def dekorator_s_parametry(parametr):
    def muj_dekorator(funkce):
        def obalena_funkce():
            if parametr == "pozdrav":
                print("Mám tě pozdravit.")
                funkce()
                print("Tak jsem tě pozdravil.")
        return obalena_funkce
    return muj_dekorator

@dekorator_s_parametry("pozdrav")
def pozdrav():
    print("Ahoj!")


print("výstup volání dekorované funkce pozdrav()")
pozdrav()

bez dekoru

def dekorator(parametr):
    def muj_dekorator(funkce):
        def obalena_funkce():
            if parametr == "pozdrav":
                print("Mám tě pozdravit.")
                funkce()
                print("Tak jsem tě pozdravil.")
        return obalena_funkce
    return muj_dekorator

def pozdrav_bez_dekoru():
    print("Ahoj!")

print("výstup dekorátoru na obalené funkci pozdrav()")
dekorator("pozdrav")(pozdrav_bez_dekoru)()

porovnej s vícenásobným dekorováním, kde bylo ekvivalentní

@vypocet_objemu_krychle
@zmer_cas
@validuj_vstup
def obsah_ctverce(a):
    time.sleep(1)  # na sekundu zdržíme běh programu, jinak je tak rychlý, že bychom dostali čas běhu nulový.
    return a**2

obsah_ctverce(3)

se zápisem bez dekoru

vypocet_objemu_krychle(zmer_cas(validuj_vstup(obsah_ctverce)))(3)
Editované
Avatar
Adam Černý
Člen
Avatar
Adam Černý:25.11.2024 19:08

Příklady jsou neúměrně složité pro začátečníky, musel jsem celé téma nastudovat jinde, kde je vysvětleno polopatě, úměrně entry-level znalostem, ale hlavně - na jednodušších příkladech, kde nejsou matoucí názvy. 16. i 17. lekce jsou jeden obrovský zmatek. Z textu i ukázek zde je to extrémně těžké téma pochopit - absence krokování, chybějící vysvětlení v přirozeném jazyce co se vlastně v průběhu kódu s funkcemi děje. Jinde je to o řády srozumitelnější + jasný ukázkový kód.

Avatar
Jean Kocman :3.12.2024 16:29

Vysvětleno je to pěkně. O tom žádná. Je to ale skutečně dost náročné. Používám AI aby mi pomohla to ještě více zjednodušit a zdá se, že to jde. Chápu, že to nelze zjednodušovat úplně "pro blbé", ale teď je toho prostě hodně...

Avatar
Robert Fučík:16. januára 22:01

Lol, tak tohle už je vážně bída. Toto je opravdu nešťastné. Text je formulován takovými slovy a spojeními, že jednotlivé věty jsou pro mě zcela nesrozumitelné. Možná proto již moje mysl není schopna vnímat jakýkoliv sdělený kontext. Představované kódy jsou v podstatě jen prázdné výstupy, které mi nepřinášejí žádné konkrétní informace – například výsledek "2" je pro mě bez jakéhokoli užitečného kontextu. Dekorátory mohou být užitečným nástrojem, avšak způsob jejich vysvětlení v této lekci mi přijde nedostatečný a matoucí. Lekci 17 jsem pouze zběžně prošel. Věřím, že si o tom budu muset podrobněji promluvit s ChatGPT, který je schopen detailně krok za krokem vysvětlit jednotlivé chování, na rozdíl od prostého výpisu čísla 2.

Avatar
Vanda Klepetková:25. apríla 18:17

Zatím nejhůř vysvětlená kapitola ze všech. Zadala jsem ChatGPT, aby mi vytvořila příklad třídního dekorátoru, abych to pochopila. Příklad měl 10 řádků. Z jakého důvodu autor vysvětluje látku, která je i podle jeho slov hodně pokročilá technika, na takto komplexním příkladu? Bylo by vhodné minimálně napsat oba - jak jednoduchý, tak komplexnější. Btw pokud se nepletu, funkce super() není nikde vysvětlená.

Avatar
Barbora Zdvihalová:4. júla 9:46

Tezke priklady, malo vysvetlovani. Uvitala bych, kdyby primo v kodu bylo vic vysvetleni (pomoci """ nebo #). Textu moc nerozumim, takze si to nastuduji jinde. :)

Avatar
Přemysl Tišer:12. júla 16:12

Podrobněji popsat, co dekorátory provádějí. Z textu mi to nebylo jasné, ale když jsme si procházel kód "krok po kroku", pochopil jsem, co dělá, snadněji.

Avatar
Pavel Buřič :1. augusta 8:48

nejasné vysvětlení co vlastně dekorátor je a jaký je účel. popravdě za poslední dvě lekce o dekorátorech vlatně pomalu ani nevím k čemu jsou dobré:( jen mi to akorát zamotalo vše

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 30.