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 – 2. diel - Prvá objektová aplikácia v Pythone - Hello object world

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
Honza Bittner
Tvůrce
Avatar
Honza Bittner:24.2.2017 13:12

Btw. od verze 3.6 funguje i interpolace přímo ve stringu, který má prefix f, tj. například

f"Hi {name}, how are you?"
Odpovedať
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
brevnovak
Člen
Avatar
brevnovak:22.2.2018 12:57

me prijde hroze divny, ze instanci objektu muzeme libovone pridavat atributy:

zdravic.zvire="te­le"
print (zdravic.zvire)

cekal bych, ze to vyhodi chybu s tim, ze objekt zdravic zadny atribut zvire nemá..

Avatar
gcx11
Tvůrce
Avatar
Odpovedá na brevnovak
gcx11:22.2.2018 19:46

To je z toho důvodu, jak jsou implementované objekty v Pythonu. Svoje atributy mají uložené ve slovníku __dict__, takže při přiřazení se do slovníku uloží nová položka s názvem atributu a jeho hodnotou.

Avatar
Matěj K
Člen
Avatar
Matěj K:1.4.2018 14:47

Ahoj,

vytvoril jsem si kalkulacku v OOP.
Mohl bych poprosit o radu, co by se dalo udelat lepe nebo jak udelat jinak, aby to bylo spravne pro objetkove programovani?
Snad bude odkaz pro cteni.

https://www.itnetwork.cz/…lighter/1053

Moc dekuju :)

Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovedá na Matěj K
Martin Petrovaj:1.4.2018 16:19

Ahoj, kalkulačka vyzerá super a je aj okomentovaná, to sa u študentov často nevidí :-) Možno by som ti sem len vypísal pár možností na doladenie, ale inak je to celkom fajn:

  • v metóde podil používaš try/catch blok, aby si zachytil delenie nulou. Keďže v try máš len jeden príkaz tak to nie je nič strašné, ale do budúcna je dobré vedieť, že kód v try bloku sa vykonáva o čosi pomalšie než normálne. V prípade, že presne vieš, na čom môže daná časť kódu spadnúť (v tvojom prípade vtedy, ak y == 0), je lepšie túto situáciu ošetriť jednoduchou podmienkou na začiatku metódy, než odchytávať predvídateľnú výnimku. Tiež pozor na to, že pri súčasnej implementácii tvoja metóda volba napr. pri zadaní 0 / 1 nevypíše výsledok, ale bude výsledok 0 brať ako false positive.
  • V metóde voľba to už je síce pochopiteľnejšie a použitie try / catch dáva väčší zmysel, stále ale vieš pred konverziou pomerne jednoducho skontrolovať, či vstupný reťazec obsahuje len povolené znaky (číslice, des. bodku…) :-) Tiež často pri volaní volba opakuješ tie isté / veľmi podobné reťazce v parametroch, hlavne ten druhý - nedali by sa uložiť ako atribút kalkulačky pri volaní jej konštruktora?
  • k metóde cyklus: aby si sa nabudúce nemusel zdržiavať ošetrovaním veľkých / malých písmen, môžeš nabudúce vstup "uhladiť" metódou string.upper() alebo string.lower(). Zápis podmienok na konci metódy je síce formálne ok a v poriadku, len ťa chcem upozorniť, že zápis typu if podmienka: return True else: return False sú väčšinou programátorov vnímané ako trochu úsmevné. Chápem, že kvôli tomu, že tam je aj elif, aj else to z fleku nejde, ale je k dispozícii dosť alternatív:
# alternatíva 1:
nezadano = True
while nezadano:
        pokracovani = input("Chces pokracovat?[y/n]: ").lower()
        if len(pokracovani) == 1 and pokracovani in "yn":
                return pokracovani == "y"
        else:
                print("Spatne zadani")

# alternatíva 2:
pokracovani = ""
while pokracovani not in ("y", "n"):
        pokracovani = input("Chces pokracovat?[y/n]: ").lower()
else:
        return pokracovani == "y"

# tvoja verzia - v poriadku, ale pôsobí trochu redundantne
nezadano = True
while nezadano:
        pokracovani = input("Chces pokracovat?[y/n]:")
        if pokracovani == "y" or pokracovani == "Y":
                return True
        elif pokracovani == "n" or pokracovani == "N":
                return False
        else:
                print("Spatne zadani")

Čo sa týka princípov dodržiavania OOP, celkovo si nie som 100% istý tým, či by Kalkulačka mala robiť aj počítanie, aj výpis do konzoly a ešte si aj sama riadiť interakciu s používateľom v metóde cyklus… Medzi dobré praktiky patrí aj single responsibility principle, podľa ktorého by kalkulačka mala len pri volaní svojich metód počítať, všetky vstupy by mala dostávať odinakiaľ a tiež tam naspäť posielať výstupy, namiesto "svojvoľného" vypisovania do konzoly, k tomu by sa mala uchyľovať buď len pri vypisovaní podstatných chýb, alebo by ich ideálne mala len vyhodiť vyššie.

Na záver ti ako motiváciu na ďalšie učenie skúsim prihodiť ešte príklad trochu modulárnejšej kalkulačky :-)

class InvalidSquareRootError (Exception): pass

class Kalkulacka:

        def __init__(self):
                # Ukážka implementácie switchu v Pythone pomocou typu slovník (dict) s anonymnými metódami
                self.__operacie = {
                        '+': lambda x, y: x+y,
                        '-': lambda x, y: x-y,
                        '*': lambda x, y: x*y,

                        # Špeciálny zápis podmienky v anonymnej funkcii:
                        '/': lambda x, y: x/y if x!=0 else raise ZeroDivisionException("Chyba: Nemôžem deliť nulou"),
                        '**': lambda x, y: x**y,
                        #'odmoc': lambda x, y: raise InvalidSquareRootError("Chyba: Párna odmocnina záporného čísla") if y%2 and x<0 else x**(1/y)
                }

                self.__operands = []

        def __getitem__(self, strindex): return self.__operacie[strindex]
        def __setitem__(self, strindex, value): self.__operacie[strindex] = value


kalk = Kalkulacka()
# Kalkulačke vieme jednoducho dodefinovať nové operácie:
kalk["odmoc"] = lambda x, y: raise InvalidSquareRootError("Chyba: Párna odmocnina záporného čísla") if y%2 and x<0 else x**(1/y)

# S touto kalkulačkou viem vykonať ľubovoľnú v slovníku zadefinovanú operáciu:
operacia = kalk[input("Zadaj operáciu: ")]
vysledok = operacia(*kalk.operands)             # alebo kompaktnejšie: vysledok = kalk[input("Zadaj operáciu: ")](*kalk.operands)
# samozrejme si dávame pozor na naše vlastné výnimky + KeyError a ak si kalkulačka sama parsuje podsunutý vstup, tak aj na ValueError

Snáď som na nič nezabudol. Have fun coding!

Editované
Odpovedať
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Matěj K
Člen
Avatar
Odpovedá na Martin Petrovaj
Matěj K:1.4.2018 16:27

Díky moc za skvely popis:) vsechno si to poradne proctu a vyzkousim:)

Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:1.4.2018 16:27

Late edit: prineskoro som si všimol, že do lambdy sa v Pythone raise vopchať nedá. Moja chyba :-D

Odpovedať
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Filip Něnička:4.4.2019 20:33

Ahoj.
Nevíte proč mi nejde importovat modul? ModulNotFoundError. Umístil jsem soubor do adresáře s konzolí, ale pořád nejede. Děkuji za radu.

Filip

Avatar
Rudolf Kov
Člen
Avatar
Rudolf Kov:8.6.2019 21:21

Ahoj, můžu se zeptat, proč mi takhle napsaná kalkučka místo výsledku napíše "function Poctari.secti at 0x02FFE1E0>" ?

class Poctari:
def secti(a, b):
return a + b
def vynasob(a, b):
return a * b
def odecti(a, b):
return a - b
def vydel(a, b):
return a / b
poctar = Poctari

funkce = int(input("Jakou operaci chcete provést? Pro sčítání stiskněte 1, pro násobení 2, pro odčítání 3 a pro dělení 4. Děkujeme"))

poctar.a = int(input("Zadejte 1. číslo"))
poctar.b = int(input("Zadejte 2. číslo"))

if funkce == 1:
print(poctar.secti)
elif funkce == 2:
print(poctar.vy­nasob)
elif funkce == 3:
print(poctar.o­decti)
elif funkce == 4:
print(poctar.vydel)
else:
print("chyba")

Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovedá na Rudolf Kov
Jindřich Máca:14.6.2019 10:57

Ahoj, nejspíš proto, že to máš špatně. :D Ale vážně, máš tam docela hodně chyb v základních věcech, takže bych Ti vřele doporučil projít si poctivě celý zdejší seriál na Python.

Funkční řešení by mohlo vypadat např. takto:

class Poctari:
    # Počáteční definice hodnot
    a = 0
    b = 0

    # Počítání s hodnotami (atributy) uloženými uvnitř třídy

    def secti(self): # U metod je důležité uvádět definici self
        return self.a + self.b

    def vynasob(self):
        return self.a * self.b

    def odecti(self):
        return self.a - self.b

    def vydel(self):
        return self.a / self.b


poctar = Poctari() # Instance třídy se píše se závorkami

funkce = int(input("Jakou operaci chcete provést? Pro sčítání stiskněte 1, pro násobení 2, pro odčítání 3 a pro dělení 4. Děkujeme"))

poctar.a = int(input("Zadejte 1. číslo"))
poctar.b = int(input("Zadejte 2. číslo"))

# Volání metod se také píše se závorkami, stejně jako volání funkcí
if funkce == 1:
    print(poctar.secti())
elif funkce == 2:
    print(poctar.vynasob())
elif funkce == 3:
    print(poctar.odecti())
elif funkce == 4:
    print(poctar.vydel())
else:
    print("chyba")
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 97.