====== 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.