NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

Diskuze – Lekce 22 - Magické metody v Pythonu podruhé

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
Veronika Knížková :21. srpna 11:43

Příklad k metodě __getattr__() je na mě moc složitě pojat. Jsem začátečnice a nejsem si jista, zda je tato lekce pro začátečníky, ač se v této lekci setkáváme s pokročilými metodami. Možná by stačilo uvést dva příklady jeden jednodušší pro lepší pochopení s lidštějším vysvětlením a druhý tedy obsáhlejší.

Odpovědět
21. srpna 11:43
Motivace je to, díky čemuž začnete. Zvyk je to, díky čemuž v tom budete pokračovat. — Jim Ryan
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Veronika Knížková
DarkCoder:21. srpna 13:59

Ano, __getattr__() je už trochu pokročilejší téma – a hlavně: ten příklad v lekci je bohužel špatně. Takže vůbec nevadí, že to nedává smysl – není to tvoje chyba.

Odpovědět
21. srpna 13:59
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Veronika Knížková
DarkCoder:21. srpna 14:27

Nejjednodušší forma:

bez __getattr__

class Osoba:
    def __init__(self, jmeno):
        self.jmeno = jmeno

osoba = Osoba("Veronika")

print(osoba.jmeno)
print(osoba.vek)

vypíše se jméno a následně Python vyhodí výjimku AttributeError.

S __getattr__

class Osoba:
    def __init__(self, jmeno):
        self.jmeno = jmeno

    def __getattr__(self, atribut):
        return f"(Atribut '{atribut}' zatím neexistuje)"

osoba = Osoba("Veronika")

print(osoba.jmeno)
print(osoba.vek)

Teď místo pádu program zachytí pokus o přístup k neexistujícímu atributu a vrátí vlastní zprávu.

Odpovědět
21. srpna 14:27
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Veronika Knížková :21. srpna 14:45

Skvělý, děkuji za objasnění na těchto příkladech. Už na první dobrou, člověk pochopí smysl této metody a použití.

Odpovědět
21. srpna 14:45
Motivace je to, díky čemuž začnete. Zvyk je to, díky čemuž v tom budete pokračovat. — Jim Ryan
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Veronika Knížková
DarkCoder:21. srpna 14:49

Není zač.

Jiný příklad, s dynamickým vytvářením atributu.

class Hmyz:
    def __init__(self):
        self.stav = "kukla"  # jediný atribut na začátku

    def __getattr__(self, jmeno):
        if jmeno == "velikost_kridel":
            return "Křídla zatím nemám – ještě nejsem motýl."
        raise AttributeError(f"Atribut '{jmeno}' neexistuje.")

    def premen_se_v_motyla(self, velikost_kridel):
        self.stav = "motýl"
        self.velikost_kridel = velikost_kridel  # atribut vznikne za běhu


hmyz = Hmyz()

print(hmyz.velikost_kridel)   # ⬅ zavolá __getattr__, protože atribut neexistuje
hmyz.premen_se_v_motyla(10)
print(hmyz.velikost_kridel)   # ⬅ teď už existuje, getattr se nevolá

Souhrn:
__getattr__() = záchrana při neexistujících atributech
Pokud už atribut existuje (např. velikost_kridel po proměně), tak se __getattr__() ani nezavolá
Takže žádné if stav == ... potřeba není

Odpovědět
21. srpna 14:49
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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 5 zpráv z 45.