Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 17. 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
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é

 
Odpovedať
+1
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.
 
Odpovedať
15.8.2024 8:55
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é 5.10.2024 22:43
 
Odpovedať
+1
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.

 
Odpovedať
+1
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ě...

 
Odpovedať
3.12.2024 16:29
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.

 
Odpovedať
+3
16. januára 22:01
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á.

 
Odpovedať
25. apríla 18:17
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é 7 správy z 17.