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):
 
    <vas_kod>

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

<vas_kod>

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.
courses/bab37zpr/tutorials/lab08.txt · Last modified: 2023/11/28 10:26 by vencovac