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
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 ;)

Avatar
Filip Stupka
Tvůrce
Avatar
Filip Stupka:6.6.2023 18:51

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

Avatar
Odpovedá 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.

Avatar
Odpovedá 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."
Avatar
Odpovedá na Filip Stupka
Hana Svobodová:28.6.2023 14:26

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

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?

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í.

Avatar
Odpovedá 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.

Avatar
Odpovedá 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.

Avatar
Odpovedá 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
Editované
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é 10 správy z 95.