====== 8. Objekty ======
===== Objektově orientované programování =====
* Termíny //třída// a //datový typ// označují v jazyku Python stejný pojem
* V jazyku Python je každá hodnota objekt
* Na cvičeních jsme se již setkali s řadou tříd, např. ''%%int%%'' nebo ''%%str%%''
* Termín //objekt// nebo //instance// je používán pro označení instance určité třídy: ''%%5%%'' je objekt typu ''%%int%%''
* Můžeme vytvářet vlastní třídy - vhodné pokud máme v programu objekty s podobným chováním (například bod v 2D prostoru, který můžeme charakterizovat jeho souřadnicemi a vzdáleností od počátku).
* Definice vlastní třídy se provádí pomocí klíčového slova ''%%class%%''
class Nazev_tridy:
class Pes:
def zastekej(self):
print('Haf!')
Maxipes = Pes()
Maxipes.zastekej()
==== Metoda __init__ ====
* Jedná se o tzv. inicializační metodu (**konstruktor**).
* Tato metoda se volá automaticky při vytvoření objektu!
* Podobných //speciálních// metod je v Pythonu více. Poznáte je tak, že obsahují **dvě podtržítka, jméno metody a dvě podtržítka** (viz. metoda ''%%__str__%%'' pro převod objektu na textový řetězec)
class Pes:
def __init__(self, jmeno=False, vek=False):
self.jmeno = jmeno
self.vek = vek
def zastekej(self):
if self.jmeno:
print('{}: Haf!'.format(self.jmeno))
else:
print('Haf!')
Maxipes = Pes(jmeno='Maxipes')
Maxipes.zastekej()
==== Metody objektu na sobě můžou záviset ====
class Pes:
def __init__(self, jmeno=False, vek=False):
self.jmeno = jmeno
self.vek = vek
self.trenink = False
def zastekej(self):
if self.trenink:
if self.jmeno:
print('{}: Haf!'.format(self.jmeno))
else:
print('Haf!')
else:
if self.jmeno:
print('{} neumí štěkat na povel.'.format(self.jmeno))
else:
print('Neumím štěkat na povel!')
def trenuj(self):
if self.trenink:
if self.jmeno:
print('{} už je vytrénovaný!'.format(self.jmeno))
else:
print('Pes už je trénovaný!')
else:
self.trenink = True
Alik = Pes()
Alik.zastekej()
Alik.trenuj()
Alik.zastekej()
=== Přístup k atributě objektu ===
Alik.trenink = True
Alik.zastekej()
Alik.jmeno = 'Alik' # přímý přístup k atributě
Alik.zastekej()
===== Úloha 1. - Trojúhelnik =====
Napište objekt ''%%trojuhelnik%%'', který bude obsahovat metody ''%%obvod%%'', ''%%obsah%%'', ''%%pravouhly%%''. Objekt přijímá parametry buď dvou či tří stran. V případě, že uživatel zadá pouze dvě strany počítáme s tím, že se jedná o trojúhelník pravoúhlý jehož přeponu je potřeba dopočítat.
Metody ''%%obvod%%'' a ''%%obsah%%'' vrací vypočítaný obvod a obsah trojúhelníku. Metoda ''%%pravouhly%%'' vrací ''%%True%%'' v případě, že je trojúhelník pravoúhlý, jinak ''%%False%%''.
class trojuhelnik:
def __init__(self):
def obvod(self):
a = trojuhelnik(3,4)
print(a.obvod())
print(a.obsah())
print(a.pravouhly())
==== Dědění (inheritance) ====
Odvození nové třídy ze třídy stávající. Odvozená třída přebírá metody třídy stávající.
class Ovcak(Pes): # přímé/jednoduché dědění
def __init__(self, jmeno=False, vek=False):
super().__init__(jmeno, vek) # příkaz super označuje, že chceme použít metodu z objektu Pes
def sedni(self):
if self.jmeno:
print('{} si sednul.'.format(self.jmeno))
else:
print('Pes si sednul.')
Hafan = Ovcak(jmeno='Hafan')
Hafan.zastekej()
Hafan.sedni()
===== Úloha 2. - Kružnice vepsaná, opsaná =====
Napište objekt kruznice_vepsana (případně kruznice_opsana), tak, aby tento objekt dědil parametry objektu trojuhelnik. Nově vytvořený objekt by měl obsahovat metodu na výpočet poloměru kružnice vepsané/opsané.
kruznice_v = kruznice_vepsana(5,5,5)
kruznice_v.polomer()
kruznice_o = kruznice_opsana(5,5,5)
kruznice_o.polomer()
===== Úlohy na doma =====
* Začněte přemýšlet nad tématy semestrálni práce, pokud jste již nějaké téma zvolili, nahlašte tuto informaci cvičícímu.