Obsah
v Krajta existují takzvané „magické“ metody, tj. metody, které jsou konstruovány a mají zvláštní název a které se nazývají pouze za určitých okolností, protože přímé volání těchto metod není v rozsahu programu obvyklé.Stavitelé
Metoda __init__ má na starosti jednání jako konstruktor, to znamená, že inicializuje řadu atributů a spustí kód, který definujeme v okamžiku, kdy je vytvořen objekt třídy, nazvaný „__init__“ se dvěma podtržítky na začátek a konec inicializačního slova, pak už k tomu máte správnou syntaxi Krajta berte to jako „magickou“ metodu a vězte, že to musí být provedeno při vytváření instance třídy.
Konstruktor dosáhne toho, že místo inicializace objektu provedete následující:
>>> f = FooBar () >>> f.init ()
Již umístěním tohoto kódu objekt inicializoval své atributy pouze pomocí:
>>> f = FooBar ()
Jak vidíte, je to důležité ukládání při kódování a pomoc v případě, že zapomeneme inicializovat objekt.
Vytvoření konstruktoru
Vytvořte konstruktor v Krajta Je to docela jednoduché, musíme definovat metodu a přidat, co je třeba udělat při vytváření objektu, podívejme se na příklad:
Na obrázku vidíte definovanou metodu a v tom, co musí provést, vidíme, že definuje atribut somevar a rovná se 42. Podívejme se na příklad, jak by běžel objekt této třídy:
Na obrázku to vidíme při definování objektu f typu FooBar Je inicializován a při přístupu k jeho atributu somevar vytiskne 42, což je hodnota definovaná v konstruktoru.
Nyní, co se stane, pokud chceme, aby byly atributy dynamicky inicializovány, přepíšeme metodu následujícím způsobem:
třída FooBar: def __init __ (self, hodnota = 42): self.somevar = hodnota
Při vytváření volitelného parametru můžeme předat hodnotu, v případě, že ji nepředáme, bude to trvat 42 jako výchozí hodnotu.
Provedení programu by bylo následující:
>>> f = FooBar ('This is a constructor argument') >>> f.somevar 'This is a constructor argument'
Tímto způsobem jsme udělali náš konstruktor dynamickým, abychom mohli našim objektům přiřadit různé atributy v závislosti na našich potřebách v programu.
Přepisování konstruktoru
Jsou chvíle, kdy musíme dědit ze super tříd, proto někdy musíme přepsat konstruktor, podívejme se na následující příklad, abychom pochopili, o co jde:
Zde jsme vytvořili třídu s názvem Bird, kde konstruktor definuje atribut hungry, provedeme následující a uvidíme, jak to funguje:
>>> b = Bird () >>> b.eat () Aaaah … >>> b.eat () Ne, díky!
Nyní, co se stane, pokud budeme dědit z této třídy, podívejme se na následující kód:
třída SongBird (Bird): def __init __ (self): self.sound = 'Squawk!' def sing (self): tisk vlastního zvuku
Spouštíme malý program:
>>> sb = SongBird () >>> sb.sing () Squawk!
Pokud zavoláme metodu eat (), uvidíme chybu:
>>> sb.eat () Traceback (poslední hovor poslední): Soubor "", řádek 1, v? Soubor „birds.py“, řádek 6, in eat if self.hungry: AttributeError: Instance SongBird nemá žádný atribut 'hungry'
Výjimka nám říká, že atribut hungry neexistuje, takže musíme v našem konstruktoru zavolat konstruktor super třídy:
třída SongBird (Bird): def __init __ (self): Bird .__ init __ (self) self.sound = 'Squawk!' def sing (self): tisk vlastního zvuku
Nyní při spuštění kódu bude vše fungovat bez problémů:
>>> sb = SongBird () >>> sb.sing () Squawk! >>> sb.eat () Aaaah … >>> sb.eat () Ne, díky!
Tímto tutoriál dokončíme, již víme, jak použít metodu __init__ základním způsobem a jak to udělat, když musíme dědit z vyšší třídy.Líbil se vám tento návod a pomohl mu?Autora můžete odměnit stisknutím tohoto tlačítka, čímž mu dáte kladný bod