NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 5 - Zapouzdření atributů podrobně v Pythonu

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
OLGA TITZENTHALEROVÁ:17.11.2023 21:31

Neni to raketová věda, tak ji z toho nedělejte...celé OOP je napsané tak, aby se člověk bál to celé pochopit. Byl by skvělý diagram, nebo slovníček pojmů co je co: třída, metoda, instance, parametr, atribut, konstruktor. Když jsem si to rozepsala na papír a barevně si označila co je co, přestal to být guláš ale na první dobrou to člověk z tohohle nepochopí.

 
Odpovědět
17.11.2023 21:31
Avatar
Karel Zaoral
Člen
Avatar
Karel Zaoral:17.11.2023 21:47

Ahoj Olgo, díky za zpětnou vazbu. Každý člověk se učí jinak a co vyhovuje jednomu, nebude zase vyhovovat jinému. Pro tebe funguje přístup, který jsi popsala, jiný to v textu vidí a zas zatápe někde jinde. Snažíme se v lekcích poskytnout ucelené informace, ale hlavní těžiště práce je na studentovi. Pročíst lekci a zkopírovat kód příkladů nestačí. K úspěšnému pochopení je třeba hlavně tvořit vlastní kód, od nejjednodušších skriptů až ke komplexním programům. Pak si každý může vytvořit vlastní systém, jak podané informace zpracovat, aby je pochopil. Hezký víkend přeji!

 
Odpovědět
17.11.2023 21:47
Avatar
Dušan Kovářík:12.1.2024 20:02

Velice děkuji za tuto lekci! Je vidět, že si s tím dal autor práci a není to jen upravený článek z tutoriálů OOP v jazycích Java nebo C#. Použití __slots__ je pro mě úplná novinka. Chtěl bych se zeptat, jestli se v Pythonu tato konstrukce používá běžně nebo se programátoři spíš řídí konvencí, že názvy privátních atributů začínají podtržítkem, a zkrátka to respektují? Předem díky moc za odpověď.

 
Odpovědět
12.1.2024 20:02
Avatar
Dušan Kovářík:12.1.2024 20:49

V testu za touto lekcí je otázka ohledně označení atributu dvěma podtržítky se správnou odpovědí, která nesedí (nechci napovídat). Myslím, že když označím atribut dvěma podtržítky, stává se nepřístupným i pro čtení, protože následující kód vyvolá chybu:

class Uzivatel:
    def __init__(self, jmeno, vek):
        self.__jmeno = jmeno
        self.__vek = vek

karel = Uzivatel("Karel Novák", 35)
print(karel.__vek)  # vyvolá chybu!

Jak to tedy je?

 
Odpovědět
12.1.2024 20:49
Avatar
Karel Zaoral
Člen
Avatar
Odpovídá na Dušan Kovářík
Karel Zaoral:13.1.2024 13:42

Ahoj Dušane, máš pravdu, tak jak to bylo uvedené, je zavádějící, odpovědi jsem upravil. Díky za zpětnou vazbu.

 
Odpovědět
13.1.2024 13:42
Avatar
Vaclav Sivak
Člen
Avatar
Odpovídá na OLGA TITZENTHALEROVÁ
Vaclav Sivak:2.8.2024 14:59

Přesně jako bez sešitu bych se ztrácel =) já tak jedu od začátku s barevnýma fixama a rozdelením co je pevně daný text a to co dopisujš pokaždé jinak. Ale to je holt Python všechno se da naprogramovat mi přijde na 150 zpusobu a vysledek je stejný a tak je to i stim učením že každy to potřebuje trochu jinak.

Odpovědět
2.8.2024 14:59
Logic leads to Nihilism
Avatar
Jan Koubek :10.12.2024 9:28

Nějak nechápu zapouzdření. Když v

kostka = Kostka(10)

, změním hodnotu na

kostka = Kostka(300)

, tak mám rázem třistastěnnou kostku bez ohledu na jakákoliv podtržítka. Co mi unika?

 
Odpovědět
10.12.2024 9:28
Avatar
Jan Vaněk
Člen
Avatar
Odpovídá na Jan Koubek
Jan Vaněk:6. ledna 13:43

Ahoj, jsem uplný nováček a teď jsem tuhle lekci 5 přečetl poprvé, ale chápu to tak, že to zapouzdření tak jak jsme si ho v té lekci nadefinovali neříká, že nemůžeš vytvořit kostku (tedy novou instanci třídy) s 300 stěnami, to klidně můžeš, ale nemůžeš (resp. neměl bys) změnit ten počet stěn té jedné konkrétní již vytvořené instance za chodu. Jinými slovy nesmí dál v kódu existovat ta instance kostka = Kostka(10), která by měla 300 stěn.
To ty ale v tom kódu vlastně neděláš - tys vytvořil instanci "kostka" s 10stěnami, ale vzápětí jsi tu instanci přepsal, takže žádná instance kostka = Kostka(10) už neexistuje. Je to jako nějaké proměnné přiřadit natvrdo v kódu najednou jinou hodnotu...
Aspoň tak to chápu já, ale budu rád když odpoví někdo povolanější :)

 
Odpovědět
6. ledna 13:43
Avatar
Kamil Kahoun
Člen
Avatar
Kamil Kahoun:23. února 19:37

mám poněkud stále problém pochopit zapouzdření a skrývání, vysvětlování mě akorát více zmátlo :/ ale snad to chápu dostatečně

 
Odpovědět
23. února 19:37
Avatar
Adam Černý
Člen
Avatar
Odpovídá na Jan Koubek
Adam Černý:9. března 9:42

Ahoj Honzo. Když objekt tvoříš konstruktorem, tak objekt vznikne podle zadaných parametrů. Když novému objektu "kostka" zadáš konstruktor Kostka(300), tak mu tím říkáš, že má v třídě Kostka použít atribut pocet_sten s hodnotou 300.

Objekt "kostka" tak vzniká (inicializuje se) jako 300stěnná kostka. Dvojitá podtržítka znemožňují přepisovat atribut existujícího objektu, ale nemají vliv na konstruktor, kdy objekt ještě neexistuje, ale teprve vzniká.

Tvůj kód si spusť takto (+ nejdřív si zakomentuj __str__ metodu):

kostka = Kostka(10)
print(kostka)
kostka = Kostka(365)
print(kostka)

Výsledkem bude v konzoli viditelný odkaz na dva různé objekty. Zavolal jsi 2× konstruktor se stejným jménem objektu ("kostka"), takže vznikly 2 různé objekty, každý s jinou hodnotou atributu "pocet_sten".
První objekt už neexistuje, zanikl zavoláním druhého konstruktoru s identickým názvem objektu (Garbage collector místo v paměti uvolní).
U druhého konstruktoru nový objekt kostka s 365 stěnami existuje a platí pro něj v lekci probíraná omezení - atribut "pocet_sten" nepůjde měnit přímo, jen přes name mangling. Když v kódu doplníš za konstruktor 2. objektu toto:

kostka._Kostka__pocet_sten = 10
print(sestistenna)

tak atribut přepíšeš na 10 stěn. Když toto:

kostka.__pocet_sten = 100
print(sestistenna)

nestane se nic a počet stěn zůstane na hodnotě 10.

Editováno 9. března 9:44
 
Odpovědět
9. března 9:42
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 10 zpráv z 10.