Razred

V preteklosti smo že uporabljali razrede kot so str, int, float (imenovali smo jih podatkovni tipi) in pa Turtle. Ustvarimo svoj lasten razred, imenovan Tocka.

Razmislimo o konceptu matematične točke. V ravnini točko predstavljata dve števili (koordinati), ki ju obravnavamo kot en predmet. Točke zapisujemo v oklepajih, z vejico, ki ločuje koordinati. Na primer (0, 0) predstavlja koordinatno izhodišče $O$, (4, 3) pa predstavlja točko $A$, ki je 4 enote desno in 3 enote nad koordinatnim izhodiščem.

Tipične operacije, ki jih povezujemo s točkami so računanje razdalje od točke do koordinatnega izhodišča ali do druge točke, računanje središča med dvema točkama, ugotavljanje ali leži točka znotraj danega pravokotnika ali kroga. Kmalu bomo videli, kako lahko te operacije organiziramo skupaj s podatki.

Naravna predstavitev točke je z dvema številskima vrednostima. Za delo s točkami bomo ustvarili razred Tocka, ki bo za vsako točko vseboval dve lastnosti _x in _y, ki predstavljata koordinati točke. Kre gre za lastnosti objekta, torej notranji spremenljivki, njuni imeni pišemo s podčrtajem. Naš razred izgleda takole:

class Tocka:

  def __init__(self):
    self._x = 0
    self._y = 0


Definicije razredov so lahko kjerkoli v programu, vendar jih običajno postavimo na začetek programa (takoj za uvozom zunanjih knjižnic – stavki import).

Razred ima posebno metodo, ki se imenuje __init__. Ta metoda se samodejno izvede vsakokrat, ko se ustvari nov primerek objekta. V tej metodi nastavimo lastnosti objekta oziroma začetne vrednosti teh lastnosti. Parameter self označuje na novo ustvarjeni objekt, ki mu nastavljamo začetne vrednosti.

Pri objektnem programiranju do lastnosti objekta običajno ne dostopamo neposredno. Običajno za delo z lastnostmi objekta uporabljamo metodi vrni (ang. get; od tod izraz getter) in nastavi (ang. set; od tod izraz setter), ki ju moramo definirati.

Lastnost objekta pa lahko tudi izbrišemo z metodo izbrisi (ang. delete; od tod izraz deleter), ki pa jo redko uporabljamo. Poleg lastnosti so lahko zasebne tudi metode, kar pomeni, da jih ne moremo klicati neposredno.

Dodajmo metodi za nastavljanje in vračanje vrednosti lastnosti:

class Tocka:

  def __init__(self):
    self._x = 0
    self._y = 0

  def vrni_x(self):
    return self._x

  def nastavi_x(self, x):
    self._x = x

  def vrni_y(self):
    return self._y

  def nastavi_y(self, y):
    self._y = y