Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 4. diel - Hracia kocka v Pythone - Zapuzdrenie a konštruktor

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
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Daniel Pícha:10. septembra 22:08

Někdo by opravdu neměl učit... napadá mne parafráze z filmu "Dead Man"

Xebeche.... he who talks loud, say nothing....

Hodně textu, málo informací....žádné vysvětlení "Class variable", "Instance variable" atd.

Avatar
Jiří Bláha:8. novembra 19:39

pro laiky by to chtělo víc vysvětlení pro pochopení se musím ptát AI.

Avatar
Tomáš Bičík:19. novembra 19:46

Tak já to zatím moc nechápu, abych se přiznal :-D Napíšeme sedmnáct řádků kódu a vypíše se 6 :-D

Avatar
DarkCoder
Člen
Avatar
DarkCoder:20. novembra 0:17

Po přečtení mnoha komentářů v diskuzi, kde uživatelé reagovali na článek o konstruktoru v Pythonu s nepochopením, jsem se rozhodl věnovat tématu bližší pohled. Po prostudování článku jsem byl opravdu zděšen – jeho obsah se od správného pojetí konceptu konstruktorů v Pythonu výrazně odchyluje.

Hodně jsem přemýšlel, jak celé vysvětlení podat, protože jde o klíčové téma, jehož nepochopení může negativně ovlivnit výuku následných témat. Nakonec jsem se rozhodl uvést jednotlivé pasáže, které jsou špatně nebo nepřesné, a doplnit k nim správné vysvětlení, jak to funguje v Pythonu. Autor článku totiž často vysvětluje konstruktor stylem, jak bývá obvyklé v jiných programovacích jazycích, což je pro Python zavádějící.

Doufám, že si tento příspěvek přečte co nejvíce lidí učících se Python, aby včas eliminovali chyby uvedené v článku a osvojili si správné chápání konstruktorů v Pythonu.

Tedy zde jsou ony pasáže které jsou chybné či nepřesné a uvedení na pravou míru:

„Právě Kostka() je konstruktor.“

Kostka() není konstruktor, jen volání třídy. Konstruktor v Pythonu je metoda __new__(). __init__() je inicializátor, volaný po vytvoření instance.

„Python si sám vygeneruje prázdnou metodu.“

Python nic negeneruje; jen dědí prázdný __init__() ze základní třídy object. Pokud třída nemá __init__(), použije se zděděný prázdný inicializátor. Žádné „generování“ se neděje.

„Metodu __init__() můžeme považovat za konstruktor.“

To je zavádějící: __init__() nevytváří objekt. __init__() inicializuje existující objekt. Konstruktor je __new__().

„Metoda se sama zavolá při vytvoření objektu.“

Formulace „sama“ může vyvolat dojem, že metoda funguje autonomně. __init__() (a __new__()) se spouští automaticky v reakci na volání třídy, ne sama od sebe.

„Popis rozdílu mezi __new__() a __init__() vyžaduje hlubší znalosti… většina programátorů nikdy nepotřebuje přepsat __new__().“

Tohle je alibistické a naprosto absurdní! Vždyť se tím vyhýbáte jádru tématu s výmluvou: "To je moc složité."

Je to jako kdyby v článku o tom, jak funguje motor auta, autor napsal:

„Abychom to nemuseli vysvětlovat, motor ignorujme a zaměřme se na volant.“

Rozdíl se dá vysvětlit jednoduše a je klíčový pro pochopení konstruktorů. Stručné vysvětlení: __new__() vytváří objekt, __init__() nastavuje jeho atributy. Pro většinu tříd stačí měnit __init__().

„Python přestane generovat bezparametrický konstruktor, pokud přidáme parametr do __init__().“

Python nic negeneruje. To je chování dědičnosti, ne generování. Pokud __init__() má parametry, musíš je při vytvoření poskytnout. Pokud mají defaultní hodnoty, nejsou povinné. Není to „generování“ nového konstruktora.

Stručné shrnutí správného modelu pro Python:

Volání třídy: Kostka()

Python spustí postupně:

obj = Kostka.__new__(Kostka)
Kostka.__init__(obj, ...)
return obj

__new__() – konstruktor

statická metoda
vytváří instanci
běží první
často nepřepisovaná

__init__() – inicializátor

nastavuje atributy
běží po __new__()
nevrací nic
většina tříd jej přepisuje

Dědičnost místo generování

Pokud třída nemá __init__(), použije se prázdný inicializátor zděděný z object.
Python nevytváří žádný konstruktor automaticky.

Závěrem doufám, že autor článku zváží brzkou úpravu obsahu článku, aby odrážel skutečné chování Pythonu, zabránil dalším nedorozuměním a pomohl čtenářům osvojit si přesný model konstruktorů v Pythonu.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Martin Kučera:Včera 20:24

Matoucí a nepřehledné.
pokud bych si nestáhl vzor tak základ neudělám.

Posledné komentáre sú na spodnej časti poslednej stránky.
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é 5 správy z 95.