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 2 - První objektová aplikace v Pythonu - Hello object world

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
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?"
Odpovědět
24.2.2017 13:12
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á..

 
Odpovědět
22.2.2018 12:57
Avatar
gcx11
Tvůrce
Avatar
Odpovídá 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.

 
Odpovědět
22.2.2018 19:46
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 :)

 
Odpovědět
1.4.2018 14:47
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá 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!

Editováno 1.4.2018 16:20
Odpovědět
1.4.2018 16:19
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Matěj K
Člen
Avatar
Odpovídá na Martin Petrovaj
Matěj K:1.4.2018 16:27

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

 
Odpovědět
1.4.2018 16:27
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

Odpovědět
1.4.2018 16:27
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

 
Odpovědět
4.4.2019 20:33
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")

 
Odpovědět
8.6.2019 21:21
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá 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")
 
Odpovědět
14.6.2019 10:57
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 86.