10. Objekty¶
Objekty slouží ke spojení souvisejících dat a často i operací na těchto
datech. Třída (class
) je předpis (šablona) pro vytváření nových
objektů nějakého typu. Nejjednodušším případem jsou tzv. struktury
(záznamy), sloužící pouze ke spojení souvisejících dat (např. souřadnic
jednoho bodu). Některé programovací jazyky mají speciální typ pro definici
struktury obsahující několik datových položek, v Pythonu se k tomu
využívají jednoduché třídy s metodu __init__
, která nastaví
(inicializuje) všechny požadované atributy struktury. Syntaxe pro
vytvoření struktury je následující:
Třída může obsahovat i další metody (funkce pracující na datech objektu).
Objekt pak má nějaký stav (data, atributy) a navíc i chování (metody).
Prvním parametrem metody je vždy objekt, na kterém došlo k volání této metody,
silnou konvencí je nazývat tento parametr self
.
S objekty jsme pracovali již mnohokrát. Například seznamy jsou objekty s
metodami jako append
, sort
, atd. A třeba knihovna turtle obsahuje
třídu Turtle
pro reprezentaci kreslící želvy. Nový objekt želvy se
vytvoří voláním turtle1 = Turtle()
.
Další konvencí Pythonu je pojmenovávat atributy, ke kterým by nemělo být
přistupováno z vnějšku přímo, ale pouze pomocí metod (tzv. soukromé atributy),
s podtržítkem na začátku (např. _name
).
10.1. Struktury¶
10.1.2. Obdélník¶
Napište třídu Rectangle pro reprezentaci obdélníku o dané šířce a výšce a funkci pro výpočet obsahu předaného obdélníku.
10.1.3. Bod¶
Napište třídu pro reprezentaci bodu v rovině (parametry x a y). Potom implementujte funkci, která vypočítá vzdálenost dvou bodů.
10.1.4. Kniha¶
Napište třídu pro reprezentaci knihy (s atributy název, autor, ISBN a cena).
Dále napište funkce print_info
pro výpis informací o knize
a draw_cover
pro vykreslení obálky knihy.
Výstup může vypadat třeba nějak takto (nemusíte si ale hrát se zarovnáním do středu):
name: Cooking for Geeks
author: Jeff Potter
isbn: 0596805888
price: $22
+-------------------------+
| |
| |
| |
| Cooking for Geeks |
| |
| |
| |
| Jeff Potter |
| |
| |
| |
| |
+-------------------------+
10.2. Objekty s metodami¶
10.2.1. Kruh¶
Napište třídu pro reprezentaci kruhu s daným středem a poloměrem.
Implementujte metody pro výpočet obvodu, obsahu a vrácení informačního řetězce (__str__
).
10.2.2. Želvy¶
Prozkoumejte následující třídu pro reprezentaci kreslící želvy a vyzkoušejte si její použití.
Přidejte želvě metodu pro vykreslení mnohoúhelníka.
Upravte želvu tak, aby začínala na náhodné pozici (třeba v intervalu 0-500).
Upravte želvu tak, aby uměla kreslit i jinou barvou než černou (např. můžete přidat metodu
set_color(self, color)
).Přidejte želvě metodu, která ji posune o danou vzdálenost náhodným směrem (
random_step(self, distance)
).Napište funkci
chase(steps=10)
. Funkce vytvoří 2 želvy, jedna bude honit druhou. První (černá) bude daný počet kroků náhodně chodit (třeba o 100), druhá (červená) bude vždy chodit směrem k první (taky třena o 100).Nakonec funkce uloží obě želvy do jednoho svg (pozn.: není možné přímo použít metodusave()
), můžete využít metodu:def turn_towards(self, other_turtle): self.direction = math.atan2(other_turtle.y - self.y, other_turtle.x - self.x) / math.pi * 180
Napište funkci
multichase(steps=10, turtles=10)
, která vytvoří požadovaný počet želv a uloží je do seznamu; v každém kroku každá ze želv udělá krok (třeba 10) k nejbližší želvě (může se hodit metoda typufind_nearest(self, turtles)
, která vrátí nejbližší želvu z daného seznamu).Zkuste změnit želvy na tanky, které po sobě budou střílet.
10.2.3. Příšera¶
Doplňte následující kostru třídy a vyzkoušejte její funkčnost. Poté přidejte
příšeře další metody, např. is_defeated
, která vrací True, pokud už příšera
nemá žádné životy.
10.2.4. Zásobník¶
Vytvořte třídu pro reprezentaci zásobníku podporující operace přidání prvku, odebrání prvku a test na prázdnost.
10.2.5. Fronta¶
Vytvořte třídu pro reprezentaci fronty podporující operace přidání prvku, odebrání prvku, test na prázdnost, seřazení prvků ve frontě a konverzi fronty na zásobník.
10.2.6. Knihovna¶
Vytvořte třídu Library
pro reprezentaci kolekce knih s metodami pro přidání
knihy, odebrání knihy, nalezení knihy podle názvu nebo ISBN, nalezení všech
knih daného autora, nalezení všech knih s cenu pod zadanou mez. Pro
reprezentaci knih využijte třídu Book
ze cvičení Kniha.
10.2.7. Geometrické tvary¶
Napište třídy pro několik jednoduchých geometrických útvarů (čtverec, kruh,
rovnostranný trojúhelník). Každá třída bude mít metody pro výpočet obvodu,
výpočet obsahu a vrácení informačního řetězce (__str__
). V následující
ukázce si všimněte dynamické (pozdní) vazby jmen metod (např. get_perimeter
na řádku 10) na jejich definice (tj. skutečně volaná metoda se různí podle
toho, na jaký objekt zrovna ukazuje proměnná shape
).
10.2.8. Vektory¶
Python umožňuje přetížit mnoho operátorů (např. +, * atp.) skrze tzv.
magické funkce (např. __add__
pro přetížení operátoru +). S využitím
následující kostry implementujte třídu reprezentující vektor
10.2.9. Piškvorky¶
Vytvořte třídu Grid
pro reprezentaci čtverečkovaného pole s rozehranou
partií piškvorek. Využijte pak tuto třídu pro hru piškvorek mezi 2 hráči
(střídají se 2 hráči (symboly ‘X’ a ‘O’), tah (poloha symbolu) se načítá jako
vstup od uživatele, vyhrává hráč, který má 5 svých znaků v řadě.
10.3. Doplňující zdroje¶
(Námět: napište funkci, která dostane seznam (barevných kruhů) a nějakým způsobem je vykresli – např. pomocí želví grafiky, knihovny Image, nebo uložením vektorového obrázku ve formátu SVG.)