NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
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 4 - Hrací kostka v Pythonu - Zapouzdření a konstruktor

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
Marie Pazoutova:23.5.2023 15:20

Ahoj!
Na zaver lekce je v hodu kostkou nejdriv print() sestistennou, pak ale pred desetistennou predchazi tato funkce:

print("\n", desetistenna, sep=" ")

Proc? Pochopila jsem, ze si hod druhou kostkou takto vypisu o jeden radek niz, ale uz mi neni jasny ten zbytek zavorky (smazala jsem ho a pustila to pro srovnani, moudra z toho stejne nejsem). Ok, uz se tomu blizim, nejprve si skocim o radek dal, pak si vypisu, cim hazim - tedy objekt desetistenna, a nakonec separuju mezerou? Proc sep=" " chybelo u sestistenne?
A proc si takhle divne vypisuju obsah te konkretni instance z tridy kostka, kdyz mi to vrati takovy nehezky citelny cosi:
<__main__.Kostka object at 0x7f1ce8bfdb20> ?

Dik ;)

 
Odpovědět
23.5.2023 15:20
Avatar
Filip Stupka
Tvůrce
Avatar
Filip Stupka:6.6.2023 18:51

Nenašel jsem nikde vysvětlené, proč importujeme random vnitřně

 
Odpovědět
6.6.2023 18:51
Avatar
Odpovídá na Marie Pazoutova
Patrick Hamal:27.6.2023 23:03

Správně ma bejt sep="" a NE sep=" "Tak aby další řádek byl zarovnán.

 
Odpovědět
27.6.2023 23:03
Avatar
Odpovídá na Vladimír Nováček
Hana Svobodová:28.6.2023 14:25

Také jsem nad tím přemýšlela. Zjistila jsem toto:

"Pokud modul naimportujete jen uvnitř metody nebo funkce, znamená to, že modul je naimportován pouze v rámci této konkrétní metody nebo funkce. Tím se omezí viditelnost modulu na pouze daný blok kódu, a to z důvodu minimalizace jmenných konfliktů a snížení závislostí.

Existuje několik důvodů pro tuto praxi:

  1. Jmenná izolace: Vnitřní import umožňuje skrýt modul před zbytkem kódu mimo danou metodu nebo funkci (zabrání se kolizím jmen, pokud se v kódu používají stejná jména).
  2. Optimalizace paměti: V případě, že modul obsahuje rozsáhlou funkcionalitu nebo vyžaduje značné množství paměti, může být vhodné naimportovat ho pouze tam, kde je skutečně potřeba, a ne globálně v celém kódu.
  3. Snížení závislostí: V případě, že je modul potřebný pouze pro konkrétní část kódu, není nutné ho naimportovat globálně a vytvářet závislosti na něm pro celý program."
 
Odpovědět
28.6.2023 14:25
Avatar
Odpovídá na Filip Stupka
Hana Svobodová:28.6.2023 14:26

Také jsem si k tomu hledala více... Viz moje odpověď panu Nováčkovi.

 
Odpovědět
28.6.2023 14:26
Avatar
Petco
Člen
Avatar
Petco:2.7.2023 13:13

Ahoj, Hneď na začiatku som narazil na vec, ktorej celkom nerozumiem. V texte o zapúzdrení sa píše:
"Přidáme do třídy tedy metodu vrat_pocet_sten(), která nám vrátí hodnotu atributu pocet_sten a tento atribut upravíme na neveřejný. Docílíme tím v podstatě toho, že je atribut read-only (atribut není viditelný a lze ho pouze číst metodou, změnit ho nelze)."

Vzápätí som kód z textu prepísal a na záver som doplnil dva riadky a na moje prekvapenie sa mi neverejné atribúty pokojne prepísali aj keď by nemali:

class Kostka:

def __init__(self):
self.__pocet_sten = 6

def vrat_pocet_sten(sel­f):
return self.__pocet_sten

kostka = Kostka()
print(kostka.vrat_po­cet_sten()) # vypíše 6

kostka.__pocet_sten = 12 # toto by asi nemalo urobiť
print(kostka.__po­cet_sten) #pokojne vypíše 12

Niečo som nesprávne pochopil?

 
Odpovědět
2.7.2023 13:13
Avatar
Dalimil Horváth:5.7.2023 16:04

Rád bych pochopil tvrzení u metod níže, kdy: "Ta první se volá při vytváření objektu, ale většinou si vystačíme s druhou metodou, která se volá při inicializaci."*

__new__()
__init__()

Není mi zde jasné, co se myslí vytvořením objektu a inicializací. Měl jsem za to, že inicializace je kostka = Kostka?

Děkuji předem za dovysvětlení.

 
Odpovědět
5.7.2023 16:04
Avatar
Odpovídá na Petco
Michal Salvet:13.7.2023 20:03

Nevim jestli nereknu blbost ale muzes si to vyzkouset. Vypada to ze na predposlednim radku kodu jen definujes promennou ktera nema nic spolecneho s atributem uvnitr tridy a tu pak poslednim radkem kodu vytisknes.
Zkus konec kodu zmenit na print(kostka.vrat_po­cet_sten) a melo by to byt stale 6. Kazdopadne pokud bys to same udelal u public (zadne podtrzitko) nebo protected atributu (jedno podtrzitko) tak by ho to v te tride zmenilo. Ten privatni jde taky zmenit zvenku ale je to kapku slozitejsi.

 
Odpovědět
13.7.2023 20:03
Avatar
Odpovídá na Dalimil Horváth
Michal Salvet:13.7.2023 20:19

Taky by me zajimala odpoved na prvni cast otazky.
GPT vyhodil spousta infa kterym se nema ted cenu zabyvat ale toto je asi pro nas podstatne.

In summary, the __new__ method can be useful in certain advanced scenarios where you require fine-grained control over instance creation. However, for most everyday programming tasks, you can achieve the desired behavior by utilizing the __init__ method and other class methods and attributes.

Ta druha cast inicializace a vytvoreni objektu, to chapu tak, objekt je vzdy vytvoren kdyz se rovna nejake tride ale pokud tam nejsou __init__ tak nejsou inicializovany a prirazeny automaticky nejake startovni atributy a tim je jen vytvoren ale pokud tam je __init__ tak je zaroven inicializovan.

 
Odpovědět
13.7.2023 20:19
Avatar
Odpovídá na Petco
Jaroslav Jančár:15.7.2023 20:42

Ahoj, tak jsem si zkusil jestli se změní hodnota počtu stěn na hodnotu 20 a vše je v pořádku. Hodnota je dvěmi podtržítky ochráněna, nejde zvenčí změnit. Podívej se:

from Arena import Kostka

sestistenna = Kostka()
desetistenna = Kostka(10)

print(sestistenna)
for _ in range(10):
    print(sestistenna.hod(), end= " ")
print("\n")

print(desetistenna)
for _ in range(10):
    print(desetistenna.hod(), end= " ")
print("\n")

print("Ahoj Petco, níže je pokus o změnu počtu stěn na 20")
desetistenna.__pocet_sten = 20
print(desetistenna)
for _ in range(10):
    print(desetistenna.hod(), end= " ")
print("\n")

a při tomto je ve výpisu toto:

Kostka s 6 stěnami
2 5 2 2 3 2 6 1 5 6

Kostka s 10 stěnami
3 10 9 3 6 4 6 2 7 4

Ahoj Petco, níže je pokus o změnu počtu stěn na 20
Kostka s 10 stěnami
9 5 8 9 7 2 6 1 8 9


Process finished with exit code 0
Editováno 15.7.2023 20:45
Odpovědět
15.7.2023 20:42
ThinkPad L450 // Windows 11 // MSI Stealth 15M
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 90.