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