Na pískovišti máš formičku na bábovku. Formička sama bábovka není, je to předpis, jak bábovka vypadá. Podle jedné formičky uděláš kolik bábovek chceš. Každá je samostatná: jednu rozšlápneš a ostatní zůstanou.
Objektově orientované programování (OOP) staví programy přesně takhle. Popíšeš předpis (třídu) a podle něj vyrábíš objekty. Hry, aplikace i webové stránky jsou plné objektů: hráčů, tlačítek, objednávek.
Pes: každý pes má jméno a umí štěkat.rex = Pes("Rex") a bety = Pes("Bety") jsou dva objekty třídy Pes.rex.jmeno je „Rex“.rex.stekej()__init__ a self__init__ je metoda, kterou Python zavolá při vytvoření objektu a nastaví v ní počáteční atributy. self je první parametr každé metody a znamená „tento objekt“.self.jmeno = jmeno uloží jméno do právě vytvářeného objektu.class Ucet: def __init__(self, majitel): self.majitel = majitel self.zustatek = 0 def vloz(self, castka): self.zustatek = self.zustatek + castkau = Ucet("Eva")u.vloz(100)u.vloz(50)print(u.zustatek)Ucet("Eva") vytvoří nový objekt a zavolá __init__. Do self se dosadí nový objekt, do majitel „Eva“.majitel = "Eva" a zustatek = 0.u.vloz(100) zavolá metodu, self je u. Zůstatek je 100.u.vloz(50) zvýší zůstatek na 150. print vypíše 150.a = Ucet("Eva") a b = Ucet("Petr"), pak a.vloz(10). Kolik je b.zustatek?a se účtu b netýká, stejně jako rozšlápnutá bábovka neovlivní ostatní.vyber(castka) kontrolu, aby zůstatek nešel do mínusu.def vyber(self, castka): → if castka > self.zustatek: print("Nedostatek peněz") → else: self.zustatek = self.zustatek - castka. Objekt sám hlídá, aby jeho data dávala smysl.def vloz(castka): zustatek = zustatek + castkadef vloz(self, castka): self.zustatek = self.zustatek + castkaMetoda musí mít jako první parametr self a k atributům přistupovat přes self.. Bez toho by pracovala s lokální proměnnou, ne s daty objektu.
__init__ nastaví počáteční stav, self je odkaz na aktuální objekt.Automobilka nevyrábí každé auto od nuly. Má obecný návrh „vozidlo“ a z něj odvozuje osobní auto, dodávku a autobus. Řidič navíc nepotřebuje rozumět motoru: má volant a pedály. OOP přenáší tyto principy do programování.
U maturity a pohovorů se často ptají na čtyři pilíře OOP. Projdeš je na jednom příkladu se zvířaty.
class), objekt je konkrétní instance vytvořená podle třídy. Objekt má atributy (data) a metody (funkce).class Zvire: a objekt Zvire("Micka")._zustatek); je to dohoda, ne zámek.Zůstatek účtu měníš metodou vloz(), ne přímo.class Pes(Zvire):.Pes je zvíře, proto může dědit ze třídy Zvire.zvuk() vrátí u psa „haf“, u kočky „mňau“.zvuk() předka.class Zvire: def __init__(self, jmeno): self.jmeno = jmeno def zvuk(self): return "..." def predstav_se(self): return self.jmeno + ": " + self.zvuk()class Pes(Zvire): def zvuk(self): return "haf"class Kocka(Zvire): def zvuk(self): return "mňau"for z in [Pes("Rex"), Kocka("Micka")]: print(z.predstav_se())Vypíše „Rex: haf“ a „Micka: mňau“. Pes a Kocka nemají vlastní __init__ ani predstav_se, zdědily je. Přepsaly jen zvuk(). Cyklus volá stejnou metodu a každý objekt odpoví po svém: to je polymorfismus.
Student(Osoba) potřebuje navíc atribut trida. Jak napíše __init__?def __init__(self, jmeno, trida): → super().__init__(jmeno) → self.trida = trida. super() zavolá konstruktor předka, který nastaví jméno. Pak se doplní, co je nové.Auto dědit ze třídy Kolo?Zkus každý pilíř vysvětlit vlastními slovy a pak kartičku otoč.
self.motor = Motor()).Auto není druh motoru. Špatná dědičnost dá autu metody motoru, které mu nepatří.
class Pes(Zvire)), polymorfismus (stejná metoda, různé chování) a abstrakce (jen podstatné). Dědit jen při vztahu „je“.