Python - konstruktory

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
wave wave wave wave wave