Objekt

Množina dát (atribútov) a množina funkcií (metód).

V Pythone je všetko objekt.

pozdrav = "Dobré ráno"
# máme metódy pre prácu s reťazcami

Trieda je šablóna pre vytvorenie objektov

class Dog:
    def __init__(self, name):
        self.name = name

dog1 = Dog("Buddy")

trieda = údajový typ = spôsob uloženia v pamäti

Atribúty a metódy

  • Atribúty: premenné v triede
  • Metódy: funkcie v triede
  • self je smerník na aktuálny objekt
class Dog:
    def __init__(self, name):
        # self.name je atribút
        self.name = name

    # self.bark() je metóda
    def bark(self):
        return "Haf!"

Atribúty

Každý objekt je inštancia triedy.

inštancia = trieda s konkrétnymi hodnotami atributov.

class Counter:
    step  = 0  # triedna premenná
    def __init__(self):
        self.count = 0

    def increment(self):
        self.count += Counter.step

Metódy

Opisujú správanie objektu

menia hodnoty atribútov a spôsobujú vedľajšie efekty

Konštruktor a deštruktor

Konštruktor je špeciálna metóda, ktorá sa volá na začiaktku a nastavuje počiatočné hodnoty atribútov.

Alokuje zdroje.

Deštruktor sa stará o uvoľnenie zrojov.

  • __init__ → inicializácia objektu
  • __del__ → čistenie (zriedka používané)
class Person:
    def __init__(self, name):
        self.name = name

    # deštruktor väčšinou v Pythone nie je potrebný
    def __del__(self):
        print("Objekt zmazaný")

Špeciálne metódy

  • Špeciálne metódy s __
  • Umožňujú preťaženie operátorov
class Vector:
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        return Vector(self.x + other.x)

Výnimky (Exceptions)

Funkcia sa môže skončiť neočakávaným spôsobom:

  • súbor sa nenašiel
  • spojenie sa nepodarilo
  • Operácia trvá príliš dlho
  • nie je dosť zdrojov.

Výnimka je spôsob hlásenia chyby pri vykonávaní funkcie ktorý obchádza návratovú hodnotu.

Fukcia s výnimkami má potom dva rôzne spôsoby ukončenia:

  • návratová hodnota.
  • výnimka, návratová hodnmota nie je k dispozícii.
  • Bezpečné spracovanie chýb počas behu programu
try:
    x = int("abc")
except ValueError:
    print("Konverzia zlyhala")

Čo sú výnimky?

  • Výnimka (exception) je nečakaná udalosť, ktorá nastane za behu programu.
  • Ak ju nevyriešime, program zlyhá s chybou.
  • Príklady:
    • delenie nulou
    • neexistujúci súbor
    • nesprávny vstup od používateľa

Ako sa výnimky spracúvajú?

  • Používame blok try – skús
  • Nasleduje blok except – chytaj
  • Ak nastane chyba, skript neskončí – reagujeme podľa typu chyby

Základný tvar: try / except

try:
    vysledok = 10 / 0
except ZeroDivisionError:
    print("Chyba: delenie nulou!")

Výstup:

Chyba: delenie nulou!

Bez except by program zlyhal.

Chytanie viacerých chýb

try:
    x = int(input("Zadaj číslo: "))
    print(10 / x)
except ValueError:
    print("Chyba: zadali ste niečo iné ako číslo.")
except ZeroDivisionError:
    print("Chyba: nedelíš nulou!")

Chytanie viacerých chýb naraz

try:
    x = int(input("Zadaj číslo: "))
    print(10 / x)
except (ValueError, ZeroDivisionError):
    print("Chyba: nesprávny vstup.")

Zachytenie objektu výnimky

try:
    x = int(input("Zadaj číslo: "))
    print(10 / x)
except ValueError as e:
    print(f"Chyba: {e}")
except ZeroDivisionError as e:
    print(f"Chyba: {e}")

Všeobecný except

try:
    x = int(input("Zadaj číslo: "))
    print(10 / x)
except Exception as e:
    print(f"Nečakána chyba: {e}")

👉 Využíva sa ako záložná možnosť. 👉 Neodporúča sa chytall Exception bez potreby — môže zakryť iné chyby.

Blok finally

try:
    f = open("data.txt")
    data = f.read()
except FileNotFoundError:
    print("Súbor nebol nájdený.")
finally:
    print("Ukončenie operácie.")

Blok finally sa vykoná vždy — či už nastala chyba, alebo nie. Používa sa na upratovanie (zatvorenie súboru, spojenia, ...).

Úplný tvar

try:
    # kód, ktorý môže zlyhať
    vysledok = 10 / x
except ZeroDivisionError:
    # ak nastane konkrétna chyba
    print("Delenie nulou!")
else:
    # ak nič nezlyhalo
    print(f"Výsledok: {vysledok}")
finally:
    # toto sa vykoná vždy
    print("Hotovo.")

Poradie: tryexceptelsefinally

raise – vyvolanie výnimky

vek = int(input("Zadaj vek: "))

if vek < 0:
    raise ValueError("Vek nemôže byť záporný.")

print(f"Máš {vek} rokov.")

Výstup pri zápornom veku:

Traceback (most recent call last):
  ...
ValueError: Vek nemôže byť záporný.

Kedy použiť raise?

  • Ak je vstup neplatný alebo stav nedetekovateľný inak.
  • Ak chceme explicitne hlásiť chybu vo funkcii.
def nastav_vek(vek):
    if vek < 0:
        raise ValueError("Vek musí byť nezáporné číslo.")

Vlastné výnimky

class NedostatokPenezError(Exception):
    pass

def plat(suma):
    if suma > 100:
        raise NedostatokPenezError("Nedostatok prostriedkov.")

Použitie:

try:
    plat(150)
except NedostatokPenezError as e:
    print(e)

Hierarchia vlastných výnimiek

class AppError(Exception):
    pass

class NedostatokPenezError(AppError):
    pass

class ChybaAutentifikacie(AppError):
    pass

Chytíme všetky chyby aplikácie:

try:
    ...
except AppError as e:
    print(f"Aplikačná chyba: {e}")

Literatúra

Deep Dive into Python, časť o výnimkách

Zdroje na prečítanie

  • Oficiálna dokumentácia — Exceptions: https://docs.python.org/3/tutorial/errors.html
  • Exception Hierarchy: https://docs.python.org/3/library/exceptions.html
  • Built-in Exceptions: https://docs.python.org/3/library/exceptions.html#built-in-exceptions

    Vo výnimke je uložená informácia o vzniknutom stave - chybové hlásenie

Podľa vzniknutej situácie vieme:

  • zaznamenať alebo hlásiť správu o chybe
  • Ukončiť program
  • ignorovať situáciu
  • pokúsiť sa korigovať chybu a pokračovať

Vyhadzovanie výnimiek

def divide(a, b):
    if b == 0:
        raise ValueError("Delenie nulou nie je povolené")
    return a / b

Chytanie výnimiek.

Výnimky sú organmizované do tried.

Chytíme určitú triedu výnimiek.

Vieme zachytiť aj konkrétny objekt s výnmimkou.

Pri ošetrení výnimky sa zameriame na uričý druh výnimky.

Iterátory

  • Objekty, cez ktoré možno iterovať
  • Implementujú:

    • __iter__()
    • __next__()
class Counter:
    def __init__(self, max):
        self.max = max
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.max:
            self.current += 1
            return self.current
        else:
            raise StopIteration

priklad ako použiť iterátor

counter = Counter(5)
for num in counter:
    print(num)

Generátory (jednoduchšie iterátory)

  • Jednoduchší spôsob vytvárania iterátorov
def counter(n):
    for i in range(n):
        yield i

counter = counter(5)
for num in counter:
    print(num)

Aj trieda je objekt

  • Introspekcia

Literatúra

Deep Dive into Python, druhá polovica

Reload?