Třídy a objekty v Pythonu (jako jinde...)
Příklad, který známe:
import Tkinter # importuji modul, ve kterém jsou hotové třídy
canvas =Tkinter.Canvas() # vytvořím konkrétní instanci canvas třídy Canvas
canvas.create_line(20,20,80.80) # volám metodu create_line na konkrétní instanci
Můžeme si ale vytvořit i vlastní třídy:
Představme si hru Člověče, nezlob se. Máme čtyři hráče - čtyři barvy. Každý hráč má čtyři figurky.
Všechny figurky dělají v podstatě stejné věci. "Umí" se posunout o určitý počet políček, nasadit na výchozí políčko, přijít domů atd.
Mají i svoje vlastnisti - stavy: barvu, polohu, stav, jestli jsou "vyhozené", doma, na výchozím políčku apod.
Vidíme tedy, že bychom mohli vlastně vytvořit jednu figurku a tu šestnáctkrát zkopírovat.
Přičemž v jednom okamžiku se každá kopie může nacházet každá kopie v jiném stavu.
Vytvoříme tedy třídu figurku, v ní všechny funkce (říkáme jim metody), které bude figurka umět a stavy (proměnné, které budeme umět pomocí některé z metod nastavit a budou přístupné i zvenku - atributy (vlastnosti).
Pak vytvoříme šestnáct konkrétních instancí třídy figurka. Tedy konkrétních objektů, se kterými budeme v průběhu hry pracovat.
"""
Trida pro figurku
"""
class Fig:
def __init__(self,barva,cislo): # inicializátor (konstruktor v py není správně)
self.barva = barva # atribut třídy
self.cislo = cislo
def posun(self,o_kolik): # metoda
"""
posune figurku - nastaví na aktuální pozici
"""
print('posune se')
# jinde v programu:
modra_1 = Fig("modra",1) # vytvořím konkrétní instanci třídy
modra_1.posun(10) # volám metodu třídy
print(modra_1.cislo)
print(modra_1.barva)
Další příklad
"""Třída figurka
atributy: barva, policko, na kterém se nachází
metody: posun_se - posune se o x policek, nastaví atribut policko
reset - vynuluje počítadlo, atribut policko
"""
class Figurka:
def __init__(self,bar): # inicializátor
self.barva = bar # atribut barva
self.policko = 0 # atribut policko výchozí 0
def posun_se(self,okolik):
self.policko += okolik
print("Posunula jsem se o ", self.policko, " políček.")
def reset(self):
self.policko=0
print("Vracím se domů.)")
""" Hlavní program
Vytvoříme dvě instance třídy Figurka, vylosujeme posun, posuneme.
"""
import random
cervena_fig = Figurka("červená") # vytvořím instanci
cervena_fig.posun_se(random.randint(1,7)) # volám metodu posun_se na instanci
modra_fig = Figurka("modrá") # vytvořím další instanci
modra_fig.posun_se(random.randint(1,7)) # volám metodu posun_se na instanci
if modra_fig.policko == cervena_fig.policko:
cervena_fig.reset() # figurka vyhozena, jde domů
print(cervena_fig.policko) # vytisknu atribut