NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 17 - Dekorátory podruhé - Parametrické a třídní dekorátory

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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é

 
Odpovědět
11.8.2024 11:01
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.
 
Odpovědět
15.8.2024 8:55
Avatar
Odpovídá 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)
Editováno 5.10.2024 22:43
 
Odpovědět
5.10.2024 22:41
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.

 
Odpovědět
25.11.2024 19:08
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ě...

 
Odpovědět
3.12.2024 16:29
Avatar
Robert Fučík:16. ledna 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.

 
Odpovědět
16. ledna 22:01
Avatar
Vanda Klepetková:Včera 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á.

 
Odpovědět
Včera 18:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 17.