Ahoj, moc děkuji za videa, jsou pro mě obrovským přínosem! Prosím, dělej je dále! V tomto videu mám první nejasnost: - V části 8:20-9:10 vysvětluješ, že class Programator(Clovek) může přebrat atributy self.jmeno a self.vek z Class Clovek. - Konkrétně se jedná o řádek 11: Clovek.__init__(jmeno, vek) - Když to tak pustím, hází mi to chybu. - Chyba se přestane objevovat, když řádek 11 opravím na: Clovek.__init__(self, jmeno, vek) anebo přidám funkcí super().
Máš pravdu, kód jsem ani nespouštěl, proto mi to nehodilo chybu a nedošlo mi, že tam musí být self. Napsal jsem to spíše pro srovnání s tím, jak funguje super(). V praxi by člověk měl vždy používat super(), ne volat metodu přímo přes rodičovskou třídu.
Myslel jsem, že to nepochopím, ale je tak krásně vysvětleno. Ještě se zeptam jde dědit i od vice než jednoho rodiče a pokud ano nedělá metoda super() pak nepořádek? A co prosimte pouzívás za theme do VSC ? Je moc příjemné na oči. Dik :)
Dědit od více rodičů je v Pythonu možné, ale není dobré to používat, protože je chování takové dědičnosti dost komplikované a obvykle to lze udělat i lépe. Pokud máme například třídy Zaklad1 a Zaklad2, a potom máme třídu Trida(Zaklad1, Zaklad2), tak bude mít při dědičnosti třídy Trida přednost vždy rodič Zaklad1 před rodičem Zaklad2. Řekněme, že máme například metodu pozdrav(self), která je nadefinovaná uvnitř všech tří tříd. Po zavolání Trida().pozdrav() bude samozřejmě zavolána metoda pozdrav() ze třídy Trida. Pokud odstraníme definici uvnitř této třídy a znovu zavoláme Trida().pozdrav(), tak se zavolá metoda pozdrav() ze třídy Zaklad1. Pokud není metoda pozdrav() nadefinovaná ani uvnitř třídy Trida, ani uvnitř Zaklad1, potom je teprve zavolána metoda pozdrav() ze třídy Zaklad2. Stejně tak funguje i super() - uvnitř třídy Trida bude mít vždy hodnotu třídy Zaklad1, takže pokud zavoláme uvnitř metody Trida.__init__() metodu super().__init__(), zavolá se nám Zaklad1.__init__(). Pokud ale zavoláme super().__init__() i uvnitř metody Zaklad1.__init__(), potom se nám navíc ještě zavolá Zaklad2.__init__(). Jinak theme, který používám, se jmenuje Dark+.
@@ConaxCoding A jestli můžu ještě docela mě štvě že pokud dedim a vytvařim init a chci dedit tak musim napsat do zavorek vsechny zdědené atributy od rodiče, dalši co je zajimave, když mám argument ne poziční ale klíčovy tak mi to od rodiče nezdědí? A posledni věc, zkoušel jsem udělat jak mas ve videu 2 metody kde jedna dědí od rodiče. Rodič tam ma u metody return a pri vytvoreni objektu a zavolaní metody od potomka tak to vypíše None ... přikladam šilenéj kod ... nikdy mi nešly nazvy proměných atd tak se neděs. Dik moc class Auta: def __init__(self, nazev="skoda", cena="1 milion", rok_vyroby= "2021"): self.nazev = nazev self.cena = cena self.rok_vyroby = rok_vyroby def vypis_auta(self, obsah="2.0TDI"): return "{0} - {3} - {1} - {2}".format(self.nazev, self.rok_vyroby, self.cena, obsah) class Typ(Auta): def __init__(self, nazev, cena, rok_vyroby, typove_auto): super().__init__(nazev, cena, rok_vyroby) self.typove_auto = typove_auto def vypis_aut(self): super().vypis_auta() skoda = Typ("skoda", "1 milion", "1995", "SUV") print(skoda.vypis_aut())
@@MrSnowkil Parametry metod nejsou nikdy děděné. Např. řekněme, že máme třídu jménem Dite dědící ze třídy, která se jmenuje Rodic. Rodic má metodu soucet(self, x, y=5). Pokud nyní vytvoříme metodu soucet i u třídy Dite, bude mít jen přesně takové parametry, které ji dáme. Můžeme třeba udělat metodu soucet(self, a=2, b=5, c=10) a stejně půjde o bezchybný kód. Jediný problém nastává, pokud chceme uvnitř metody soucet od třídy Dite zavolat metodu soucet od rodiče - tedy pokud zavoláme super().soucet(). V tom případě musíme dát při volání této metody přesně ty argumenty, které jsme nadefinovali ve třídě Rodic, protože teď už nevoláme metodu Dite.soucet, ale metodu Rodic.soucet. Ten problém s kódem, který jsi poslal, ale spočívá v něčem jiném. V metodě Typ.vypis_aut je zavolána metoda Auta.vypis_auta, která normálně vrátí hodnotu. Problém je ale v tom, že Typ.vypis_aut tuto hodnotu "neposílá dál", nijak ji nepoužije, takže hodnota propadne a metoda vrací None (tedy nevrací nic). Pro vyřešení stačí přidat před super().vypis_auta() ještě klíčové slovo return, takže ta metoda Typ.vypis_aut bude vypadat takhle: def vypis_aut(self): return super().vypis_auta() Teď se ta hodnota získaná z Auta.vypis_auta vrátí přes Typ.vypis_aut až do původního výrazu, tedy do výrazu print(skoda.vypis_aut()).
@@ConaxCoding aha aha super dik moc a k tomu posledímu, takže to jde vlastně dělat dvěma způsoby? a oba dva jsou správně? class Typ(Auta) metoda def vypis_aut(self): return super().vypis_auta() print(skoda.vypis_aut()) nebo class Typ(Auta) metoda def vypis_aut(self): super().vypis_auta() print(skoda.vypis_auta())
@@MrSnowkil V podstatě ano, oba způsoby jsou správně, ale jen první dělá to, co očekáváme - tedy to, že se po zavolání metody Typ.vypis_aut vrátí nějaký string. U druhého příkladu (bez return) se vrátí vždy None, takže ačkoliv tato metoda nevyhodí žádnou chybu, nedalo by se říct, že se chová správně.
Tento tutoriál zatím ukazuje hlavně "jádro" Pythonu, se kterým se toho moc naprogramovat nedá, ale které potřebuješ znát, než začneš dělat pokročilejší věci. Za několik dílů si ukážeme, jak do Pythonu importovat různé moduly, které nám umožní přidat nové třídy a funkce. Díky tomu budeme moct např. pracovat se soubory na počítači, komunikovat přes internet se servery, vytvářet grafická rozhraní, atd. Co s těmito znalostmi vytvoříš, to je na tobě, Python má velmi široké využití.
@@ConaxCoding ahoj moc mě tvoje videa baví ale chtěl bych se naučit něco dalšího napřed, doporučil bys mi nějaké video/stranku co se učit dál v Pythonu po OOP? :)
@@michalponcza9887 Určitě by ses měl naučit, co jsou to moduly, jak fungují, a jak instalovat moduly z PyPI (Python Package Index). Z hlavy mě žádné tutoriály nenapadají, ale určitě něco najdeš, když vyhledáš přímo toto téma.
Máš soubor někde uložený? Pokud ne, zmáčkni Ctrl + S a ulož soubor někam, kam chceš ukládat své programy v Pythonu. Nezapomeň na konec názvu souboru přidat příponu ".py"
Díky. Nicméně na 9té minutě je potřeba vyvolat program a ten se tedy ale bohužel nespustí, jsou tam errory...je to v pasáži kdy se znovu využívá dědičnost a vpíše se rodič, v našem případě Člověk a atributy...pak se ale program nespustí..
Máte pravdu, první argument, který dáváme metodě `__init__` od třídy Clovek, by měl být self, proto to vyhodí error. Tento způsob zápisu jsem ukázal jenom, abych přiblížil, jak funguje funkce super(). V praxi by člověk měl vždy použít super(), u kterého se ten argument self nezadává.
Po cca měsíci odpočinku jsem se na to podíval znovu a je to mnohem lepší. Víc tomu rozumím. Paráda, díky!
Díky! Velmi názorný kurz.
Naprostá paráda, jsi úžasnej!
Těžký, těžký! Ale skvělý!
Ahoj, moc děkuji za videa, jsou pro mě obrovským přínosem! Prosím, dělej je dále!
V tomto videu mám první nejasnost:
- V části 8:20-9:10 vysvětluješ, že class Programator(Clovek) může přebrat atributy self.jmeno a self.vek z Class Clovek.
- Konkrétně se jedná o řádek 11: Clovek.__init__(jmeno, vek)
- Když to tak pustím, hází mi to chybu.
- Chyba se přestane objevovat, když řádek 11 opravím na: Clovek.__init__(self, jmeno, vek) anebo přidám funkcí super().
Máš pravdu, kód jsem ani nespouštěl, proto mi to nehodilo chybu a nedošlo mi, že tam musí být self. Napsal jsem to spíše pro srovnání s tím, jak funguje super(). V praxi by člověk měl vždy používat super(), ne volat metodu přímo přes rodičovskou třídu.
@@ConaxCoding Super, díky ;)!
super, díky
Myslel jsem, že to nepochopím, ale je tak krásně vysvětleno. Ještě se zeptam jde dědit i od vice než jednoho rodiče a pokud ano nedělá metoda super() pak nepořádek? A co prosimte pouzívás za theme do VSC ? Je moc příjemné na oči. Dik :)
Dědit od více rodičů je v Pythonu možné, ale není dobré to používat, protože je chování takové dědičnosti dost komplikované a obvykle to lze udělat i lépe.
Pokud máme například třídy Zaklad1 a Zaklad2, a potom máme třídu Trida(Zaklad1, Zaklad2), tak bude mít při dědičnosti třídy Trida přednost vždy rodič Zaklad1 před rodičem Zaklad2. Řekněme, že máme například metodu pozdrav(self), která je nadefinovaná uvnitř všech tří tříd. Po zavolání Trida().pozdrav() bude samozřejmě zavolána metoda pozdrav() ze třídy Trida. Pokud odstraníme definici uvnitř této třídy a znovu zavoláme Trida().pozdrav(), tak se zavolá metoda pozdrav() ze třídy Zaklad1. Pokud není metoda pozdrav() nadefinovaná ani uvnitř třídy Trida, ani uvnitř Zaklad1, potom je teprve zavolána metoda pozdrav() ze třídy Zaklad2.
Stejně tak funguje i super() - uvnitř třídy Trida bude mít vždy hodnotu třídy Zaklad1, takže pokud zavoláme uvnitř metody Trida.__init__() metodu super().__init__(), zavolá se nám Zaklad1.__init__(). Pokud ale zavoláme super().__init__() i uvnitř metody Zaklad1.__init__(), potom se nám navíc ještě zavolá Zaklad2.__init__().
Jinak theme, který používám, se jmenuje Dark+.
@@ConaxCoding A jestli můžu ještě docela mě štvě že pokud dedim a vytvařim init a chci dedit tak musim napsat do zavorek vsechny zdědené atributy od rodiče, dalši co je zajimave, když mám argument ne poziční ale klíčovy tak mi to od rodiče nezdědí? A posledni věc, zkoušel jsem udělat jak mas ve videu 2 metody kde jedna dědí od rodiče. Rodič tam ma u metody return a pri vytvoreni objektu a zavolaní metody od potomka tak to vypíše None ... přikladam šilenéj kod ... nikdy mi nešly nazvy proměných atd tak se neděs. Dik moc
class Auta:
def __init__(self, nazev="skoda", cena="1 milion", rok_vyroby= "2021"):
self.nazev = nazev
self.cena = cena
self.rok_vyroby = rok_vyroby
def vypis_auta(self, obsah="2.0TDI"):
return "{0} - {3} - {1} - {2}".format(self.nazev, self.rok_vyroby, self.cena, obsah)
class Typ(Auta):
def __init__(self, nazev, cena, rok_vyroby, typove_auto):
super().__init__(nazev, cena, rok_vyroby)
self.typove_auto = typove_auto
def vypis_aut(self):
super().vypis_auta()
skoda = Typ("skoda", "1 milion", "1995", "SUV")
print(skoda.vypis_aut())
@@MrSnowkil Parametry metod nejsou nikdy děděné. Např. řekněme, že máme třídu jménem Dite dědící ze třídy, která se jmenuje Rodic. Rodic má metodu soucet(self, x, y=5). Pokud nyní vytvoříme metodu soucet i u třídy Dite, bude mít jen přesně takové parametry, které ji dáme. Můžeme třeba udělat metodu soucet(self, a=2, b=5, c=10) a stejně půjde o bezchybný kód.
Jediný problém nastává, pokud chceme uvnitř metody soucet od třídy Dite zavolat metodu soucet od rodiče - tedy pokud zavoláme super().soucet(). V tom případě musíme dát při volání této metody přesně ty argumenty, které jsme nadefinovali ve třídě Rodic, protože teď už nevoláme metodu Dite.soucet, ale metodu Rodic.soucet.
Ten problém s kódem, který jsi poslal, ale spočívá v něčem jiném. V metodě Typ.vypis_aut je zavolána metoda Auta.vypis_auta, která normálně vrátí hodnotu. Problém je ale v tom, že Typ.vypis_aut tuto hodnotu "neposílá dál", nijak ji nepoužije, takže hodnota propadne a metoda vrací None (tedy nevrací nic). Pro vyřešení stačí přidat před super().vypis_auta() ještě klíčové slovo return, takže ta metoda Typ.vypis_aut bude vypadat takhle:
def vypis_aut(self):
return super().vypis_auta()
Teď se ta hodnota získaná z Auta.vypis_auta vrátí přes Typ.vypis_aut až do původního výrazu, tedy do výrazu print(skoda.vypis_aut()).
@@ConaxCoding aha aha super dik moc a k tomu posledímu, takže to jde vlastně dělat dvěma způsoby? a oba dva jsou správně?
class Typ(Auta)
metoda def vypis_aut(self):
return super().vypis_auta()
print(skoda.vypis_aut())
nebo
class Typ(Auta)
metoda def vypis_aut(self):
super().vypis_auta()
print(skoda.vypis_auta())
@@MrSnowkil V podstatě ano, oba způsoby jsou správně, ale jen první dělá to, co očekáváme - tedy to, že se po zavolání metody Typ.vypis_aut vrátí nějaký string. U druhého příkladu (bez return) se vrátí vždy None, takže ačkoliv tato metoda nevyhodí žádnou chybu, nedalo by se říct, že se chová správně.
Co vše pak budu moct naprogramovat?
Tento tutoriál zatím ukazuje hlavně "jádro" Pythonu, se kterým se toho moc naprogramovat nedá, ale které potřebuješ znát, než začneš dělat pokročilejší věci. Za několik dílů si ukážeme, jak do Pythonu importovat různé moduly, které nám umožní přidat nové třídy a funkce. Díky tomu budeme moct např. pracovat se soubory na počítači, komunikovat přes internet se servery, vytvářet grafická rozhraní, atd. Co s těmito znalostmi vytvoříš, to je na tobě, Python má velmi široké využití.
@@ConaxCoding ahoj moc mě tvoje videa baví ale chtěl bych se naučit něco dalšího napřed, doporučil bys mi nějaké video/stranku co se učit dál v Pythonu po OOP? :)
@@michalponcza9887 Určitě by ses měl naučit, co jsou to moduly, jak fungují, a jak instalovat moduly z PyPI (Python Package Index). Z hlavy mě žádné tutoriály nenapadají, ale určitě něco najdeš, když vyhledáš přímo toto téma.
@@ConaxCoding dobře, mrknu na to, díky moc!
kdyz dam run ctrl f5 tak mi to vzdy ukaze ,ze to mam ulozit,jak to mam spravit?
Máš soubor někde uložený? Pokud ne, zmáčkni Ctrl + S a ulož soubor někam, kam chceš ukládat své programy v Pythonu. Nezapomeň na konec názvu souboru přidat příponu ".py"
Díky. Nicméně na 9té minutě je potřeba vyvolat program a ten se tedy ale bohužel nespustí, jsou tam errory...je to v pasáži kdy se znovu využívá dědičnost a vpíše se rodič, v našem případě Člověk a atributy...pak se ale program nespustí..
Máte pravdu, první argument, který dáváme metodě `__init__` od třídy Clovek, by měl být self, proto to vyhodí error. Tento způsob zápisu jsem ukázal jenom, abych přiblížil, jak funguje funkce super(). V praxi by člověk měl vždy použít super(), u kterého se ten argument self nezadává.
kedy bude ďalšia časť?
Omlouvám se za letní zpoždění. Další část vyjde do týdne.
@@ConaxCoding ok, dufam že stihneme prebrať všetko za nasledujúce 3 roky, nech mám v škole náskok
@@Kockac9.98 To určitě stihneme :)