je množina dát (atribútov) a množina funkcií (metód) ktoré pracujú s týmito dátami.
+-------------------+ ---> lower(self) -> "ahoj svet!"
| value: Ahoj Svet! |
+-------------------+ ---> upper(self) -> "AHOJ SVET!"
📚 Oficiálna dokumentácia: Python Data Model · 📖 Dive Into Python 3: Native Datatypes
# Vytvorenie
pozdrav = "Dobré ráno"
# Použitie
print(pozdrav.upper())
# Zničenie
del pozdrav
Explicitné zničenie objektu je nepovinné, Python sa o to stará sám.
📚 Oficiálna dokumentácia: objects, values and types · 📖 Dive Into Python 3: Native Datatypes
Na jeden objekt je môže existovať viacero referencií.
pozdrav1 ──┐
├──> ┌───────────────────┐
pozdrav2 ──┘ │ objekt typu str │
│ "Dobré ráno" │
└───────────────────┘
Obe premenné obsahujú referenciu na ten istý objekt.
pozdrav1 = "Dobré ráno"
pozdrav2 = pozdrav1 # obe referencie ukazujú na rovnaký objekt
📚 Oficiálna dokumentácia: assignment statements · 📖 Dive Into Python 3: Native Datatypes
import gc
data = [1, 2, 3]
del data # odstráni sa referencia na zoznam
print(gc.collect()) # ručné spustenie je zvyčajne zbytočné
list1 = [1, 2, 3]
list2 = list1 # obe referencie ukazujú na rovnaký objekt
list1.append(4) # Objekt sa zmení
print(list1) # [1, 2, 3, 4]
print(list2) # [1, 2, 3, 4]
list, dict, setint, float, str, tuplecisla = [1, 2]
cisla.append(3) # mení pôvodný zoznam
pozdrav = "Ahoj"
pozdrav += " svet" # vytvorí nový reťazec
print(cisla) # [1, 2, 3]
print(pozdrav) # Ahoj svet
📚 Oficiálna dokumentácia: built-in types · 📖 Dive Into Python 3: Native Datatypes
V triede definujeme:
📚 Oficiálna dokumentácia: classes · 📖 Dive Into Python 3: Classes & Iterators
hodnota = "Ahoj"
print(type(hodnota)) # <class 'str'>
print(isinstance(hodnota, str)) # True
print(hasattr(hodnota, "upper")) # True
📚 Oficiálna dokumentácia: classes as objects · 📖 Dive Into Python 3: Classes & Iterators
class definuje novú triedu__init__ je konštruktor, ktorý sa volá pri vytvorení objektu. Definuje počiatočné hodnoty atribútov.self je referencia na aktuálny objekt.class Dog:
def __init__(self, name):
# Name je atribút
self.name = name
dog1 = Dog("Buddy")
Opisujú správanie objektu
menia hodnoty atribútov a spôsobujú vedľajšie efekty
class Lamp:
def __init__(self):
self.svieti = False
def zapni(self):
self.svieti = True
lamp = Lamp()
lamp.zapni()
print(lamp.svieti) # True
📚 Oficiálna dokumentácia: method objects · 📖 Dive Into Python 3: Classes & Iterators
__init__ → inicializácia objektu__del__ → uvoľnenie (zriedka používané)📚 Oficiálna dokumentácia: object initialization and finalization · 📖 Dive Into Python 3: Classes & Iterators
class Person:
def __init__(self, name):
self.name = name
# deštruktor väčšinou v Pythone nie je potrebný
def __del__(self):
print("Objekt zmazaný")
Vyznačíme ich pomocou dekorátora
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(2, 3)) # 5
__class Vector:
def __init__(self, x):
self.x = x
def __add__(self, other):
return Vector(self.x + other.x)
vysledok = Vector(2) + Vector(3)
print(vysledok.x) # 5
📚 Oficiálna dokumentácia: special method names · 📖 Dive Into Python 3: Special Method Names
counter = Counter(5)
for num in counter:
print(num)
📚 Oficiálna dokumentácia: iter() and next() · 📖 Dive Into Python 3: Classes & Iterators
Implementujú rozhranie:
__iter__()__next__() vyhadzuje výnimku StopIteration, keď sa prvky minú📚 Oficiálna dokumentácia: iterator protocol · 📖 Dive Into Python 3: Classes & Iterators
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
raise StopIteration
📚 Oficiálna dokumentácia: __iter__() and __next__() · 📖 Dive Into Python 3: Classes & Iterators
class Bird:
def fly(self):
print("Vták lieta.")
class Airplane:
def fly(self):
print("Lietadlo lieta.")
def make_it_fly(thing):
thing.fly()
make_it_fly(Bird())
make_it_fly(Airplane())
Pomocou _ (podtržítko) môžeme označiť atribúty a metódy ako súkromné.
class Person:
def __init__(self, name):
self._name = name # súkromný atribút
def pozdrav(self):
return f"Ahoj, {self._name}!"
osoba = Person("Jana")
print(osoba.pozdrav()) # Ahoj, Jana!
Skryjeme tak implementačné detaily a zabraňujeme priamemu prístupu k nim z vonkajšieho kódu.
Vytovríme novú triedy pridaním nových atribútov a metód ku pôvodnej triede.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Haf!"
📚 Oficiálna dokumentácia: inheritance · 📖 Dive Into Python 3: Classes & Iterators
class Animal:
def speak(self):
return "Neznámy zvuk"
class Cat(Animal):
def speak(self): # prekrytie metódy rodiča
return "Mňau!"
print(Animal().speak()) # Neznámy zvuk
print(Cat().speak()) # Mňau!
Príklad:
class Battery:
def energy(self):
return "Batéria dodáva energiu."
class Phone:
def __init__(self, battery):
self.battery = battery
def turn_on(self):
return self.battery.energy() + " Telefón je zapnutý."
print(Phone(Battery()).turn_on())
Pri vytváraní novej triedy vieme využiť existujúce triedy (dedičnosť) a rozšíriť ich o nové atribúty a metódy.
Inheritance vs Composition
📚 Oficiálna dokumentácia: inheritance · 📖 Dive Into Python 3: Classes & Iterators
Príklad kompozície:
class Engine:
def start(self):
print("Motor sa spustil.")
class Car:
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.start()
📚 Oficiálna dokumentácia: class objects · 📖 Dive Into Python 3: Classes & Iterators
Funkcia sa môže skončiť neočakávaným spôsobom:
📚 Oficiálna dokumentácia: errors and exceptions · 📖 Dive Into Python 3: Exceptions
Výnimka je spôsob hlásenia chyby pri vykonávaní funkcie ktorý obchádza návratovú hodnotu.
Funkcia s výnimkami má potom dva rôzne spôsoby ukončenia:
try:
x = int("abc")
except ValueError:
print("Konverzia zlyhala")
try:
vysledok = 10 / 0
except ZeroDivisionError:
print("Chyba: delenie nulou!")
📚 Oficiálna dokumentácia: handling exceptions · 📖 Dive Into Python 3: Exceptions
Druh výnimky určíme podľa jej typu (triedy)
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!")
except chytí všetky výninkyVšetky výnimky sú potomkami Exception
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.
finallytry:
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, ...).
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: try → except → else → finally
📚 Oficiálna dokumentácia: try statement · 📖 Dive Into Python 3: Exceptions
raise – vyvolanie výnimkyvek = 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ý.
📚 Oficiálna dokumentácia: raise · 📖 Dive Into Python 3: Exceptions
raise?def nastav_vek(vek):
if vek < 0:
raise ValueError("Vek musí byť nezáporné číslo.")
Vieme definovať vlastných potomkov Exception . Vo výnimke je uložená informácia o vzniknutom stave - chybové hlásenie
Podľa vzniknutej situácie vieme:
class NedostatokPenazizError(Exception):
pass
def plat(suma):
if suma > 100:
raise NedostatokPenaziError("Nane love.")
📚 Oficiálna dokumentácia: user-defined exceptions · 📖 Dive Into Python 3: Exceptions
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}")
📚 Oficiálna dokumentácia: built-in exceptions · 📖 Dive Into Python 3: Exceptions
Dive Into Python 3, časť o výnimkách