Hodnoty a objekty

Než se dnes začneme zabývat třídami, podíváme na objekty.

Co pro programátory znamená slovo objekt?

V Pythonu je to jednoduché – každá hodnota (tj. něco, co můžeš uložit do proměnné, vrátit z funkce nebo třeba seznamu) je objekt. Některé jazyky (třeba Javascript, C++ nebo Java) mají i jiné hodnoty než objekty, v některých jazycích (třeba v C) objekty vůbec nejsou. Ale v Pythonu mezi hodnotou a objektem není rozdíl, takže je na jednu stranu trošku složitější pochopit, v čem spočívá ta „objektovitost“, ale na druhou stranu to zase není potřeba vědět do detailů.

Základní vlastnost objektů je to, že obsahují jak data (informace), tak chování – instrukce nebo metody, které s těmito daty pracují. Třeba řetězce v Pythonu obsahují jak informace (nějakou sekvenci znaků), tak užitečné metody jako upper nebo count. Kdyby řetězce nebyly objekty, musel by Python mít spoustu funkcí jako str_upper a str_count. Objekty spojují data a funkčnost dohromady.

Možná namítneš, že třeba len je funkce. Je to tak, Python není „stoprocentně“ objektový jazyk. Funkce len ale funguje i na objektech, které s řetězci nemají nic společného.

Třídy

Data každého objektu jsou specifická pro konkrétní objekt ("abc" obsahuje jiné znaky než "def"), ale funkčnost – metody – bývají společné pro všechny objekty daného typu. Třeba řetězcová metoda count() by se dala napsat zhruba jako:

def count(retezec, znak):
    pocet = 0
    for c in retezec:
        if c == znak:
            pocet = pocet + 1
    return pocet

… a ačkoliv bude vracet jinou hodnotu pro každý řetězec, samotná metoda je společná všem řetězcům.

Tohle společné chování určuje typ (angl. type) neboli třída (angl. class) daného objektu.

V historických verzích Pythonu byl rozdíl mezi „typem“ a „třídou“, ale dnes už jsou to synonyma.

Typ objektu umí zjistit funkce type:

>>> type(0)
<class 'int'>
>>> type(True)
<class 'bool'>
>>> type("abc")
<class 'str'>
>>> with open('soubor.txt') as f:
...     type(f)
... 
<class '_io.TextIOWrapper'>

Takže type vrací nějaké třídy. A co je to třída? Popis, jak se chovají všechny objekty daného typu.

Většinu tříd jde navíc v Pythonu zavolat, jako by to byly funkce, a vytvořit tak nový objekt dané třídy:

>>> trida_retezcu = type("abc")
>>> trida_retezcu(8)
'8'
>>> trida_retezcu([1, 2, 3])
'[1, 2, 3]'

Chová se to stejně jako funkce str! Není to podivné?

Tady se musím omluvit: materiály k funkcím tak trochu lhaly. Funkce str, int, float apod. totiž vůbec nejsou funkce – jsou to právě třídy.

>>> str
<class 'str'>
>>> type('abcdefgh')
<class 'str'>
>>> type('abcdefgh') == str
True

Ale dají se, podobně jako funkce, zavolat. Třída tedy většinou obsahuje nejen „popis“, jak se objekty daného typu budou chovat, ale umí i objekty daného typu vytvořit.

Vlastní třídy

A proč najednou tolik informací o třídách? Protože si zkusíme napsat třídu vlastní.

Třídu se hodí napsat, když plánuješ mít ve svém programu více objektů s podobným chováním. Třeba karetní hra by mohla mít třídu Karta, webová aplikace třídu Uživatel, tabulkový procesor třídu Řádek.

My teď potřebujeme napsat program o zvířátkách. Začni tím, že napíšeš třídu pro koťátka, která umí mňoukat:

class Kotatko:
    def zamnoukej(self):
        print("Mňau!")

Tak jako se funkce definují pomocí def, třídy mají klíčové slovo class, za které napíšeš jméno třídy, dvojtečku, a pak odsazené tělo třídy. Podobně jako def dělá funkce, příkaz class udělá novou třídu a přiřadí ji do proměnné daného jména (tady Kotatko).

Třídy se tradičně pojmenovávají s velkým písmenem, aby se nepletly s „normálními“ hodnotami.

Základní třídy (str, int atd.) velká písmena nemají, a to hlavně z historických důvodů – původně to byly opravdu funkce.

V těle třídy můžeš definovat metody, které vypadají úplně jako funkce – jen mají první argument self. Ten si ale vysvětlíme později – zamňoukání má přednost:

# Vytvoření konkrétního objektu
kotatko = Kotatko()

# Volání metody
kotatko.zamnoukej()

V tomhle příkladu si dej pozor na velikost písmen: Kotatko (s velkým K) je třída – popis, jak se koťátka chovají. kotatko (s malým k) je konkrétní objekt (angl. instance) té třídy: hodnota, která reprezentuje kotě. Onen konkrétní objekt vytvoříme zavoláním třídy, stejně jako zavoláním str() se dá vytvořit konkrétní řetězec.

Mňau!

Atributy

Objekty vytvořené z „vlastních“ tříd mají jednu vlastnost, kterou třídy jako str nedovolují: možnost si definovat vlastní atributy – informace, které se uloží k danému objektu. Atributy se označují tak, že mezi hodnotu a jméno jejího atributu napíšeš tečku:

mourek = Kotatko()
mourek.jmeno = 'Mourek'

micka = Kotatko()
micka.jmeno = 'Micka'

print(mourek.jmeno)
print(micka.jmeno)

Na začátku jsme si řekly, že objekty spojují chování a data. Chování je definováno ve třídě, data se schovávají právě v atributech jednotlivých objektů. Podle atributů jako jméno můžeš jednotlivá koťátka rozlišit.

Asi sis všimla, že tečkou se dostaneš jak k metodám převzaným z třídy, tak k atributům specifickým pro konkrétní objekt. Co se stane, když má atribut stejné jméno jako metoda z třídy? Vyzkoušej si to:

micka = Kotatko()
micka.zamnoukej = 12345
micka.zamnoukej()

Parametr self

A teď se na chvíli vrátíme k metodám, konkrétně k parametru self.

Každá metoda má přístup ke konkrétnímu objektu, na kterém pracuje, právě přes argument self. Teď, když máš koťátka pojmenovaná, můžeš pomocí self rozjet dialog:

class Kotatko:
    def zamnoukej(self):
        print("{}: Mňau!".format(self.jmeno))

mourek = Kotatko()
mourek.jmeno = 'Mourek'

micka = Kotatko()
micka.jmeno = 'Micka'

mourek.zamnoukej()
micka.zamnoukej()

Co se stalo? Výraz mourek.zamnoukej udělá metodu, která, když ji zavoláš, předá objekt mourek jako první argument funkce zamnoukej.

Tohle je to, čím se metoda liší od normální funkce: metoda si „pamatuje“ objekt, na kterém pracuje.

A takový první argument, který obsahuje konkrétní objekt právě definované třídy, se tradičně pojmenovává self. (Když ho pojmenuješ jinak, ostatní programátoři se na tebe budou koukat hodně divně.)

A může taková metoda brát víc než jeden argument? Může – self se doplní na první místo, a zbytek argumentů se vezme z volání metody. Třeba:

class Kotatko:
    def zamnoukej(self):
        print("{}: Mňau!".format(self.jmeno))

    def snez(self, jidlo):
        print("{}: Mňau mňau! {} mi chutná!".format(self.jmeno, jidlo))

mourek = Kotatko()
mourek.jmeno = 'Mourek'
mourek.snez('ryba')

Metoda __init__

A když jsme u argumentů, je ještě jedno místo, kde můžeš třídě poslat argumenty: když vytváříš nový objekt (voláním třídy). Dá se tak hezky vyřešit problém, který možná vidíš v předchozím kódu: aktuálně každé koťátko potřebuje, aby se mu po vytvoření nastavilo jméno, jinak metoda zamnoukej nebude fungovat. Třída se ale dá udělat i tak, že půjde jméno nastavit už při vytváření, takhle:

mourek = Kotatko(jmeno='Mourek')

Na tohle používá Python metodu, která se jmenuje __init__ (dvě podtržítka, init, dvě podtržítka). To „opodtržítkování“ znamená, že tohle jméno je nějakým způsobem speciální. Metoda __init__ se totiž zavolá automaticky, když se vytvoří nový objekt. Dá se tedy napsat:

class Kotatko:
    def __init__(self, jmeno):
        self.jmeno = jmeno

    def zamnoukej(self):
        print("{}: Mňau!".format(self.jmeno))

    def snez(self, jidlo):
        print("{}: Mňau mňau! {} mi chutná!".format(self.jmeno, jidlo))

mourek = Kotatko('Mourek')
mourek.zamnoukej()

A teď už není možnost, jak vytvořit koťátko bez jména, takže zamnoukej bude vždycky fungovat.

Podobných „opodtržítkovaných“ metod je víc, třeba __str__ se volá, když je potřeba převést objekt na řetězec:

class Kotatko:
    def __init__(self, jmeno):
        self.jmeno = jmeno

    def __str__(self):
        return '<Kotatko jmenem {}>'.format(self.jmeno)

    def zamnoukej(self):
        print("{}: Mňau!".format(self.jmeno))

    def snez(self, jidlo):
        print("{}: Mňau mňau! {} mi chutná!".format(self.jmeno, jidlo))

mourek = Kotatko('Mourek')
print(mourek)

Cvičení: Kočka

Teď, když už umíš dělat koťátka, zkus vytvořit třídu pro kočku.

  • Kočka umí mňoukat metodou zamnoukej.
  • Kočka má na začátku (při vytvoření) 9 životů (nemůže mít nikdy víc než 9 nebo míň než 0!).
  • Kočka umí říct, jestli je živá (nemá 0 životů), metodou je_ziva.
  • Kočka může ztratit život metodou uber_zivot.
  • Kočku můžeš nakrmit metodou snez, která bere 1 argument - nějaké konkrétní jídlo (řetězec). Pokud je toto jídlo "ryba", kočce se obnoví jeden život (pokud teda už není mrtvá, nebo nemá maximální počet životů).

Řešení

A to je o samotných třídách zatím vše. Příště si něco řekneme o dědičnosti. A o štěňátkách.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/plzen-podzim-2019:class:0",
      "title": "Třídy",
      "html": "\n          \n    \n\n    <h1>Hodnoty a objekty</h1>\n<p>Ne&#x17E; se dnes za&#x10D;neme zab&#xFD;vat t&#x159;&#xED;dami,\npod&#xED;v&#xE1;me na objekty.</p>\n<p>Co pro program&#xE1;tory znamen&#xE1; slovo <em>objekt</em>?</p>\n<p>V Pythonu je to jednoduch&#xE9; &#x2013; ka&#x17E;d&#xE1; hodnota\n(tj. n&#x11B;co, co m&#x16F;&#x17E;e&#x161; ulo&#x17E;it do prom&#x11B;nn&#xE9;, vr&#xE1;tit\nz funkce nebo t&#x159;eba seznamu) je objekt.\nN&#x11B;kter&#xE9; jazyky (t&#x159;eba Javascript, C++ nebo Java) maj&#xED;\ni jin&#xE9; hodnoty ne&#x17E; objekty, v n&#x11B;kter&#xFD;ch\njazyc&#xED;ch (t&#x159;eba v C) objekty v&#x16F;bec nejsou.\nAle v Pythonu mezi hodnotou a objektem nen&#xED; rozd&#xED;l,\ntak&#x17E;e je na jednu stranu tro&#x161;ku slo&#x17E;it&#x11B;j&#x161;&#xED; pochopit,\nv &#x10D;em spo&#x10D;&#xED;v&#xE1; ta &#x201E;objektovitost&#x201C;, ale na druhou stranu\nto zase nen&#xED; pot&#x159;eba v&#x11B;d&#x11B;t do detail&#x16F;.</p>\n<p>Z&#xE1;kladn&#xED; vlastnost objekt&#x16F; je to, &#x17E;e obsahuj&#xED; jak data\n(informace), tak <em>chov&#xE1;n&#xED;</em> &#x2013; instrukce nebo metody,\nkter&#xE9; s t&#x11B;mito daty pracuj&#xED;.\nT&#x159;eba &#x159;et&#x11B;zce v Pythonu obsahuj&#xED; jak informace\n(n&#x11B;jakou sekvenci znak&#x16F;), tak u&#x17E;ite&#x10D;n&#xE9; metody jako\n<code>upper</code> nebo <code>count</code>.\nKdyby &#x159;et&#x11B;zce nebyly objekty, musel by Python m&#xED;t\nspoustu funkc&#xED; jako <code>str_upper</code> a <code>str_count</code>.\nObjekty spojuj&#xED; data a funk&#x10D;nost dohromady.</p>\n<div class=\"admonition note\"><p>Mo&#x17E;n&#xE1; nam&#xED;tne&#x161;, &#x17E;e t&#x159;eba <code>len</code> je funkce.\nJe to tak, Python nen&#xED; &#x201E;stoprocentn&#x11B;&#x201C; objektov&#xFD; jazyk.\nFunkce <code>len</code> ale funguje i na\nobjektech, kter&#xE9; s &#x159;et&#x11B;zci nemaj&#xED; nic spole&#x10D;n&#xE9;ho.</p>\n</div><h1>T&#x159;&#xED;dy</h1>\n<p>Data ka&#x17E;d&#xE9;ho objektu jsou specifick&#xE1; pro konkr&#xE9;tn&#xED;\nobjekt (<code>&quot;abc&quot;</code> obsahuje jin&#xE9; znaky ne&#x17E;\n<code>&quot;def&quot;</code>), ale funk&#x10D;nost &#x2013; metody &#x2013; b&#xFD;vaj&#xED;\nspole&#x10D;n&#xE9; pro v&#x161;echny objekty dan&#xE9;ho typu.\nT&#x159;eba &#x159;et&#x11B;zcov&#xE1; metoda <code>count()</code> by se dala\nnapsat zhruba jako:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">count</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">,</span> <span class=\"n\">znak</span><span class=\"p\">):</span>\n    <span class=\"n\">pocet</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n    <span class=\"k\">for</span> <span class=\"n\">c</span> <span class=\"ow\">in</span> <span class=\"n\">retezec</span><span class=\"p\">:</span>\n        <span class=\"k\">if</span> <span class=\"n\">c</span> <span class=\"o\">==</span> <span class=\"n\">znak</span><span class=\"p\">:</span>\n            <span class=\"n\">pocet</span> <span class=\"o\">=</span> <span class=\"n\">pocet</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n    <span class=\"k\">return</span> <span class=\"n\">pocet</span>\n</pre></div><p>&#x2026; a a&#x10D;koliv bude vracet jinou hodnotu pro ka&#x17E;d&#xFD; &#x159;et&#x11B;zec,\nsamotn&#xE1; metoda je spole&#x10D;n&#xE1; v&#x161;em &#x159;et&#x11B;zc&#x16F;m.</p>\n<p>Tohle spole&#x10D;n&#xE9; chov&#xE1;n&#xED; ur&#x10D;uje\n<em>typ</em> (angl. <em>type</em>) neboli <em>t&#x159;&#xED;da</em> (angl. <em>class</em>) dan&#xE9;ho objektu.</p>\n<div class=\"admonition note\"><p>V historick&#xFD;ch verz&#xED;ch Pythonu byl rozd&#xED;l mezi &#x201E;typem&#x201C;\na &#x201E;t&#x159;&#xED;dou&#x201C;, ale dnes u&#x17E; jsou to synonyma.</p>\n</div><p>Typ objektu um&#xED; zjistit funkce <code>type</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;class &apos;int&apos;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;class &apos;bool&apos;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"s2\">&quot;abc&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;class &apos;str&apos;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;soubor.txt&apos;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">f</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>\n<span class=\"go\">&lt;class &apos;_io.TextIOWrapper&apos;&gt;</span>\n</pre></div><p>Tak&#x17E;e <code>type</code> vrac&#xED; n&#x11B;jak&#xE9; t&#x159;&#xED;dy.\nA co je to t&#x159;&#xED;da? Popis, jak se chovaj&#xED; v&#x161;echny objekty\ndan&#xE9;ho typu.</p>\n<p>V&#x11B;t&#x161;inu t&#x159;&#xED;d jde nav&#xED;c v Pythonu zavolat, jako by\nto byly funkce, a vytvo&#x159;it tak nov&#xFD; objekt dan&#xE9; t&#x159;&#xED;dy:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">trida_retezcu</span> <span class=\"o\">=</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"s2\">&quot;abc&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">trida_retezcu</span><span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">)</span>\n<span class=\"go\">&apos;8&apos;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">trida_retezcu</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">])</span>\n<span class=\"go\">&apos;[1, 2, 3]&apos;</span>\n</pre></div><p>Chov&#xE1; se to stejn&#x11B; jako funkce <code>str</code>! Nen&#xED; to podivn&#xE9;?</p>\n<p>Tady se mus&#xED;m omluvit:\n<a href=\"/2019/plzen-podzim-2019/beginners/functions/\">materi&#xE1;ly k funkc&#xED;m</a>\ntak trochu lhaly. Funkce <code>str</code>, <code>int</code>, <code>float</code> apod. toti&#x17E; v&#x16F;bec\nnejsou funkce &#x2013; jsou to pr&#xE1;v&#x11B; t&#x159;&#xED;dy.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">str</span>\n<span class=\"go\">&lt;class &apos;str&apos;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"s1\">&apos;abcdefgh&apos;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;class &apos;str&apos;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"s1\">&apos;abcdefgh&apos;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">str</span>\n<span class=\"go\">True</span>\n</pre></div><p>Ale daj&#xED; se, podobn&#x11B; jako funkce, zavolat.\nT&#x159;&#xED;da tedy v&#x11B;t&#x161;inou obsahuje nejen &#x201E;popis&#x201C;, jak se\nobjekty dan&#xE9;ho typu budou chovat, ale um&#xED; i objekty\ndan&#xE9;ho typu vytvo&#x159;it.</p>\n<h2>Vlastn&#xED; t&#x159;&#xED;dy</h2>\n<p>A pro&#x10D; najednou tolik informac&#xED; o t&#x159;&#xED;d&#xE1;ch?\nProto&#x17E;e si zkus&#xED;me napsat t&#x159;&#xED;du vlastn&#xED;.</p>\n<p>T&#x159;&#xED;du se hod&#xED; napsat, kdy&#x17E; pl&#xE1;nuje&#x161; m&#xED;t ve sv&#xE9;m\nprogramu v&#xED;ce objekt&#x16F; s podobn&#xFD;m chov&#xE1;n&#xED;m.\nT&#x159;eba karetn&#xED; hra by mohla m&#xED;t t&#x159;&#xED;du Karta,\nwebov&#xE1; aplikace t&#x159;&#xED;du U&#x17E;ivatel,\ntabulkov&#xFD; procesor t&#x159;&#xED;du &#x158;&#xE1;dek.</p>\n<p>My te&#x10F; pot&#x159;ebujeme napsat program o zv&#xED;&#x159;&#xE1;tk&#xE1;ch.\nZa&#x10D;ni t&#xED;m, &#x17E;e nap&#xED;&#x161;e&#x161; t&#x159;&#xED;du pro ko&#x165;&#xE1;tka, kter&#xE1; um&#xED; m&#x148;oukat:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">Kotatko</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"nf\">zamnoukej</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;M&#x148;au!&quot;</span><span class=\"p\">)</span>\n</pre></div><p>Tak jako se funkce definuj&#xED; pomoc&#xED; <code>def</code>,\nt&#x159;&#xED;dy maj&#xED; kl&#xED;&#x10D;ov&#xE9; slovo <code>class</code>,\nza kter&#xE9; nap&#xED;&#x161;e&#x161; jm&#xE9;no t&#x159;&#xED;dy, dvojte&#x10D;ku,\na pak odsazen&#xE9; t&#x11B;lo t&#x159;&#xED;dy.\nPodobn&#x11B; jako <code>def</code> d&#x11B;l&#xE1; funkce, p&#x159;&#xED;kaz\n<code>class</code> ud&#x11B;l&#xE1; novou t&#x159;&#xED;du a p&#x159;i&#x159;ad&#xED; ji\ndo prom&#x11B;nn&#xE9; dan&#xE9;ho jm&#xE9;na (tady <code>Kotatko</code>).</p>\n<p>T&#x159;&#xED;dy se tradi&#x10D;n&#x11B; pojmenov&#xE1;vaj&#xED; s velk&#xFD;m p&#xED;smenem,\naby se nepletly s &#x201E;norm&#xE1;ln&#xED;mi&#x201C; hodnotami.</p>\n<div class=\"admonition note\"><p>Z&#xE1;kladn&#xED; t&#x159;&#xED;dy (<code>str</code>, <code>int</code> atd.)\nvelk&#xE1; p&#xED;smena nemaj&#xED;, a to hlavn&#x11B; z historick&#xFD;ch\nd&#x16F;vod&#x16F; &#x2013; p&#x16F;vodn&#x11B; to byly opravdu funkce.</p>\n</div><p>V t&#x11B;le t&#x159;&#xED;dy m&#x16F;&#x17E;e&#x161; definovat metody, kter&#xE9; vypadaj&#xED;\n&#xFA;pln&#x11B; jako funkce &#x2013; jen maj&#xED; prvn&#xED; argument <code>self</code>.\nTen si ale vysv&#x11B;tl&#xED;me pozd&#x11B;ji &#x2013; zam&#x148;ouk&#xE1;n&#xED; m&#xE1; p&#x159;ednost:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"c1\"># Vytvo&#x159;en&#xED; konkr&#xE9;tn&#xED;ho objektu</span>\n<span class=\"n\">kotatko</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Vol&#xE1;n&#xED; metody</span>\n<span class=\"n\">kotatko</span><span class=\"o\">.</span><span class=\"n\">zamnoukej</span><span class=\"p\">()</span>\n</pre></div><p>V tomhle p&#x159;&#xED;kladu si dej pozor na velikost p&#xED;smen:\n<code>Kotatko</code> (s velk&#xFD;m K) je t&#x159;&#xED;da &#x2013; popis, jak\nse ko&#x165;&#xE1;tka chovaj&#xED;. <code>kotatko</code> (s mal&#xFD;m k)\nje konkr&#xE9;tn&#xED; objekt (angl. <em>instance</em>) t&#xE9; t&#x159;&#xED;dy:\nhodnota, kter&#xE1; reprezentuje kot&#x11B;.\nOnen konkr&#xE9;tn&#xED; objekt vytvo&#x159;&#xED;me zavol&#xE1;n&#xED;m t&#x159;&#xED;dy,\nstejn&#x11B; jako zavol&#xE1;n&#xED;m <code>str()</code> se d&#xE1; vytvo&#x159;it\nkonkr&#xE9;tn&#xED; &#x159;et&#x11B;zec.</p>\n<p>M&#x148;au!</p>\n<h2>Atributy</h2>\n<p>Objekty vytvo&#x159;en&#xE9; z &#x201E;vlastn&#xED;ch&#x201C; t&#x159;&#xED;d maj&#xED; jednu\nvlastnost, kterou t&#x159;&#xED;dy jako <code>str</code>\nnedovoluj&#xED;: mo&#x17E;nost si definovat vlastn&#xED;\n<em>atributy</em> &#x2013; informace, kter&#xE9; se ulo&#x17E;&#xED; k dan&#xE9;mu\nobjektu.\nAtributy se ozna&#x10D;uj&#xED; tak, &#x17E;e mezi hodnotu a jm&#xE9;no\njej&#xED;ho atributu nap&#xED;&#x161;e&#x161; te&#x10D;ku:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">mourek</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n<span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Mourek&apos;</span>\n\n<span class=\"n\">micka</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n<span class=\"n\">micka</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Micka&apos;</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">micka</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">)</span>\n</pre></div><p>Na za&#x10D;&#xE1;tku jsme si &#x159;ekly, &#x17E;e objekty spojuj&#xED; chov&#xE1;n&#xED;\na data.\nChov&#xE1;n&#xED; je definov&#xE1;no ve t&#x159;&#xED;d&#x11B;, data se schov&#xE1;vaj&#xED;\npr&#xE1;v&#x11B; v atributech jednotliv&#xFD;ch objekt&#x16F;.\nPodle atribut&#x16F; jako jm&#xE9;no m&#x16F;&#x17E;e&#x161; jednotliv&#xE1; ko&#x165;&#xE1;tka\nrozli&#x161;it.</p>\n<div class=\"admonition note\"><p>Asi sis v&#x161;imla, &#x17E;e te&#x10D;kou se dostane&#x161; jak k metod&#xE1;m\np&#x159;evzan&#xFD;m z t&#x159;&#xED;dy, tak k atribut&#x16F;m specifick&#xFD;m\npro konkr&#xE9;tn&#xED; objekt.\nCo se stane, kdy&#x17E; m&#xE1; atribut stejn&#xE9; jm&#xE9;no jako\nmetoda z t&#x159;&#xED;dy? Vyzkou&#x161;ej si to:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">micka</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n<span class=\"n\">micka</span><span class=\"o\">.</span><span class=\"n\">zamnoukej</span> <span class=\"o\">=</span> <span class=\"mi\">12345</span>\n<span class=\"n\">micka</span><span class=\"o\">.</span><span class=\"n\">zamnoukej</span><span class=\"p\">()</span>\n</pre></div></div><h2>Parametr <code>self</code></h2>\n<p>A te&#x10F; se na chv&#xED;li vr&#xE1;t&#xED;me k metod&#xE1;m,\nkonkr&#xE9;tn&#x11B; k parametru <code>self</code>.</p>\n<p>Ka&#x17E;d&#xE1; metoda m&#xE1; p&#x159;&#xED;stup ke konkr&#xE9;tn&#xED;mu objektu, na\nkter&#xE9;m pracuje, pr&#xE1;v&#x11B; p&#x159;es argument <code>self</code>.\nTe&#x10F;, kdy&#x17E; m&#xE1;&#x161; ko&#x165;&#xE1;tka pojmenovan&#xE1;,\nm&#x16F;&#x17E;e&#x161; pomoc&#xED; <code>self</code> rozjet dialog:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">Kotatko</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"nf\">zamnoukej</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">))</span>\n\n<span class=\"n\">mourek</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n<span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Mourek&apos;</span>\n\n<span class=\"n\">micka</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n<span class=\"n\">micka</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Micka&apos;</span>\n\n<span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">zamnoukej</span><span class=\"p\">()</span>\n<span class=\"n\">micka</span><span class=\"o\">.</span><span class=\"n\">zamnoukej</span><span class=\"p\">()</span>\n</pre></div><p>Co se stalo? V&#xFD;raz <code>mourek.zamnoukej</code> ud&#x11B;l&#xE1; <em>metodu</em>, kter&#xE1;, kdy&#x17E; ji zavol&#xE1;&#x161;,\np&#x159;ed&#xE1; objekt <code>mourek</code> jako prvn&#xED; argument\nfunkce <code>zamnoukej</code>.</p>\n<div class=\"admonition note\"><p>Tohle je to, &#x10D;&#xED;m se <em>metoda</em> li&#x161;&#xED; od norm&#xE1;ln&#xED; <em>funkce</em>:\nmetoda si &#x201E;pamatuje&#x201C; objekt, na kter&#xE9;m pracuje.</p>\n</div><p>A takov&#xFD; prvn&#xED; argument, kter&#xFD; obsahuje konkr&#xE9;tn&#xED;\nobjekt pr&#xE1;v&#x11B; definovan&#xE9; t&#x159;&#xED;dy, se tradi&#x10D;n&#x11B; pojmenov&#xE1;v&#xE1; <code>self</code>.\n(Kdy&#x17E; ho pojmenuje&#x161; jinak, ostatn&#xED; program&#xE1;to&#x159;i se na tebe budou koukat hodn&#x11B;\ndivn&#x11B;.)</p>\n<p>A m&#x16F;&#x17E;e takov&#xE1; metoda br&#xE1;t v&#xED;c ne&#x17E; jeden argument?\nM&#x16F;&#x17E;e &#x2013; <code>self</code> se dopln&#xED; na prvn&#xED; m&#xED;sto,\na zbytek argument&#x16F; se vezme z vol&#xE1;n&#xED; metody.\nT&#x159;eba:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">Kotatko</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"nf\">zamnoukej</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">))</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">snez</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au m&#x148;au! {} mi chutn&#xE1;!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">))</span>\n\n<span class=\"n\">mourek</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">()</span>\n<span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Mourek&apos;</span>\n<span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">snez</span><span class=\"p\">(</span><span class=\"s1\">&apos;ryba&apos;</span><span class=\"p\">)</span>\n</pre></div><h2>Metoda <code>__init__</code></h2>\n<p>A kdy&#x17E; jsme u argument&#x16F;, je je&#x161;t&#x11B; jedno m&#xED;sto,\nkde m&#x16F;&#x17E;e&#x161; t&#x159;&#xED;d&#x11B; poslat argumenty: kdy&#x17E; vytv&#xE1;&#x159;&#xED;&#x161;\nnov&#xFD; objekt (vol&#xE1;n&#xED;m t&#x159;&#xED;dy).\nD&#xE1; se tak hezky vy&#x159;e&#x161;it probl&#xE9;m, kter&#xFD; mo&#x17E;n&#xE1; vid&#xED;&#x161;\nv p&#x159;edchoz&#xED;m k&#xF3;du: aktu&#xE1;ln&#x11B; ka&#x17E;d&#xE9; ko&#x165;&#xE1;tko pot&#x159;ebuje,\naby se mu po vytvo&#x159;en&#xED; nastavilo jm&#xE9;no, jinak\nmetoda <code>zamnoukej</code> nebude fungovat.\nT&#x159;&#xED;da se ale d&#xE1; ud&#x11B;lat i tak, &#x17E;e p&#x16F;jde jm&#xE9;no nastavit\nu&#x17E; p&#x159;i vytv&#xE1;&#x159;en&#xED;, takhle:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">mourek</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">(</span><span class=\"n\">jmeno</span><span class=\"o\">=</span><span class=\"s1\">&apos;Mourek&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Na tohle pou&#x17E;&#xED;v&#xE1; Python metodu,\nkter&#xE1; se jmenuje <code>__init__</code> (dv&#x11B; podtr&#x17E;&#xED;tka,\n<code>init</code>, dv&#x11B; podtr&#x17E;&#xED;tka).\nTo &#x201E;opodtr&#x17E;&#xED;tkov&#xE1;n&#xED;&#x201C; znamen&#xE1;, &#x17E;e tohle jm&#xE9;no je n&#x11B;jak&#xFD;m zp&#x16F;sobem speci&#xE1;ln&#xED;.\nMetoda <code>__init__</code> se toti&#x17E; zavol&#xE1;\nautomaticky, kdy&#x17E; se vytvo&#x159;&#xED; nov&#xFD; objekt.\nD&#xE1; se tedy napsat:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">Kotatko</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">jmeno</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"n\">jmeno</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">zamnoukej</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">))</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">snez</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au m&#x148;au! {} mi chutn&#xE1;!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">))</span>\n\n<span class=\"n\">mourek</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">(</span><span class=\"s1\">&apos;Mourek&apos;</span><span class=\"p\">)</span>\n<span class=\"n\">mourek</span><span class=\"o\">.</span><span class=\"n\">zamnoukej</span><span class=\"p\">()</span>\n</pre></div><p>A te&#x10F; u&#x17E; nen&#xED; mo&#x17E;nost, jak vytvo&#x159;it ko&#x165;&#xE1;tko bez jm&#xE9;na,\ntak&#x17E;e <code>zamnoukej</code> bude v&#x17E;dycky fungovat.</p>\n<p>Podobn&#xFD;ch &#x201E;opodtr&#x17E;&#xED;tkovan&#xFD;ch&#x201C; metod je v&#xED;c,\nt&#x159;eba <code>__str__</code> se vol&#xE1;, kdy&#x17E; je pot&#x159;eba\np&#x159;ev&#xE9;st objekt na &#x159;et&#x11B;zec:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">Kotatko</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">jmeno</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span> <span class=\"o\">=</span> <span class=\"n\">jmeno</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&apos;&lt;Kotatko jmenem {}&gt;&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">zamnoukej</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">))</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">snez</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;{}: M&#x148;au m&#x148;au! {} mi chutn&#xE1;!&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">jmeno</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">))</span>\n\n<span class=\"n\">mourek</span> <span class=\"o\">=</span> <span class=\"n\">Kotatko</span><span class=\"p\">(</span><span class=\"s1\">&apos;Mourek&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">mourek</span><span class=\"p\">)</span>\n</pre></div><h2>Cvi&#x10D;en&#xED;: Ko&#x10D;ka</h2>\n<p>Te&#x10F;, kdy&#x17E; u&#x17E; um&#xED;&#x161; d&#x11B;lat ko&#x165;&#xE1;tka, zkus vytvo&#x159;it t&#x159;&#xED;du pro ko&#x10D;ku.</p>\n<ul>\n<li>Ko&#x10D;ka um&#xED; m&#x148;oukat metodou <code>zamnoukej</code>.</li>\n<li>Ko&#x10D;ka m&#xE1; na za&#x10D;&#xE1;tku (p&#x159;i vytvo&#x159;en&#xED;) 9 &#x17E;ivot&#x16F;\n(nem&#x16F;&#x17E;e m&#xED;t nikdy v&#xED;c ne&#x17E; 9 nebo m&#xED;&#x148; ne&#x17E; 0!).</li>\n<li>Ko&#x10D;ka um&#xED; &#x159;&#xED;ct, jestli je &#x17E;iv&#xE1; (nem&#xE1; 0 &#x17E;ivot&#x16F;), metodou <code>je_ziva</code>.</li>\n<li>Ko&#x10D;ka m&#x16F;&#x17E;e ztratit &#x17E;ivot metodou <code>uber_zivot</code>.</li>\n<li>Ko&#x10D;ku m&#x16F;&#x17E;e&#x161; nakrmit metodou <code>snez</code>, kter&#xE1; bere 1 argument -\nn&#x11B;jak&#xE9; konkr&#xE9;tn&#xED; j&#xED;dlo (&#x159;et&#x11B;zec). Pokud je toto j&#xED;dlo <code>&quot;ryba&quot;</code>, ko&#x10D;ce se obnov&#xED;\njeden &#x17E;ivot (pokud teda u&#x17E; nen&#xED; mrtv&#xE1;, nebo nem&#xE1; maxim&#xE1;ln&#xED; po&#x10D;et &#x17E;ivot&#x16F;).</li>\n</ul>\n<div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/plzen-podzim-2019/beginners/class/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">Kocka</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>         <span class=\"c1\"># Init funkce nemusi brat jako parametr</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pocet_zivotu</span> <span class=\"o\">=</span> <span class=\"mi\">9</span>   <span class=\"c1\"># pocet zivotu, ten je pokazde 9.</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">zamnoukej</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Mnau, mnau, mnauuu!&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">je_ziva</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pocet_zivotu</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">uber_zivot</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">je_ziva</span><span class=\"p\">():</span>\n            <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Nemuzes zabit uz mrtvou kocku!&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pocet_zivotu</span> <span class=\"o\">-=</span> <span class=\"mi\">1</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">snez</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">jidlo</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">je_ziva</span><span class=\"p\">():</span>\n            <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Je zbytecne krmit mrtvou kocku!&quot;</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span>\n        <span class=\"k\">if</span> <span class=\"n\">jidlo</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;ryba&quot;</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pocet_zivotu</span> <span class=\"o\">&lt;</span> <span class=\"mi\">9</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pocet_zivotu</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>\n            <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Kocka spapala rybu a obnovil se ji jeden zivot.&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Kocka se krmi.&quot;</span><span class=\"p\">)</span>\n</pre></div>\n    </div>\n</div><p>A to je o samotn&#xFD;ch t&#x159;&#xED;d&#xE1;ch zat&#xED;m v&#x161;e.\n<a href=\"/2019/plzen-podzim-2019/beginners/inheritance/\">P&#x159;&#xED;&#x161;t&#x11B;</a> si n&#x11B;co &#x159;ekneme o d&#x11B;di&#x10D;nosti.\nA o &#x161;t&#x11B;&#x148;&#xE1;tk&#xE1;ch.</p>\n\n\n        "
    }
  }
}