Python - gradnja razreda

Python - gradnja razreda

Avtor: Dani Sajtl

Objektno orientirano programiranje

Objektno orientirano programiranje (OOP) nam omogoča drugačen pristop k programiranju.

Vse temelji na razredih in objektih.

Objektno orientirano programiranje definira objekt kot črno škatlo, ki ima svoje vhode (nekaj damo v objekt) in izhode (iz objekta nekaj dobimo), vse kar pa se dogaja v objektu pa nam ni znano.

(oop_shema.png)


Z objektom komuniciramo preko njegovih metod in podatkov.

Vzemimo za primer objekt Hiša.

Kakšne podatke ima lahko takšen objekt (kakšno je stanje objekta, kaj o objektu vemo)?

  • velikost, npr. 100 m2,
  • število oken, npr. 12,
  • število vrat, npr. 10,
  • fasada, npr. ne,
  • naslov, npr. Kopitarjeva 2, 1000 Ljubljana itd.

Kakšne pa so lahko metode (kakšno je obnašanje objekta, kakšne metode lahko izvajamo nad njem)?

  • odpri okna,
  • zapri vrata,
  • spremeni fasado itd.

Razredi v Pythonu

Uporabnik lahko vpelje svoje zvrsti objektov, ki jim v Pythonu pravimo razredi. To omogoča stavek class, ki ima obliko:

(koda_00.png)

Z izrazom imeR() ustvarimo primerek (instance) razreda imeR.

Lahko imamo poljubno število objektov, ki nastanejo na podlagi istega načrta oz. razreda.

Definarjmo sedaj svoj razred Kolo, kateremu smo dodali še nekaj podatkov (znamka, tip in cena):

(koda_01.png)

Ustvarimo nov objekt kolo1 razreda Kolo in preverimo, če smo ga res ustvarili. Poglejmo si tudi kako dostopamo do posameznih podatkov.

(koda_02.png)

Ali lahko spremenimo posamezne podatke objekta kolo1? Seveda!

(koda_03.png)

Konstruktor

Za malo resnejšo definicijo svojega razreda potrebujemo konstruktor, s katerim ob tvorbi objekta nastavimo začetno stanje spremenljivk. Izvede se, ko ustvarimo primerek razreda. Konstruktor je ena od metod, ki jo definiramo v razredu (več o metodah malo kasneje), ime te metode pa je vedno __init__ (dva podčrtaja spredaj in zadaj).

Če se vrnemo k našemu razredu Kolo, bi konstrukror definirali tako kot na spodnjem primeru.

(koda_04.png)

V konstruktorju smo definirali katere podatke želimo imeti ob kreiranju objekta (druga vrstica) in vse te nastavimo na začetno vrednost (ostale vrstice). self pomeni objekt, ki ga "obdelujemo". V konstruktorju je to objekt, ki ga ustvarjamo.

Lahko pa nastavimo tudi privzete začetne vrednosti, kar nam pride prav v primeru definiranja novega objekta ob nepopolnih začetnih vrednostih. V spodnjem primeru bi bila vsa nova kolesa (če ne nastavimo drugače) znamke Pinarello, cestna in vrednosti 0.

(koda_05.png)

Metode, metoda za izpis

Funkcije definirane v razredu imenujemo metode. Metodo, ki smo jo poimenovali konstruktor, smo že spoznali. Metode, ki delujejo na primerkih objektov imajo za prvi argument self (lahko pa uporabljamo tudi druga imena).

Razred object pozna večje število vgrajenih metod, ki imajo ime, ki se začne in konča s po dvema podčrtajoma. Sem spada tudi konstruktor. Spoznajmo pa še vsaj __str__ , ki omogoča uporabo funkcije print na objektih našega razreda.

Zapišimo metodo __str__ za naš razred Kolo:

(koda_06.png)

Poglejmo kako jo uporabimo in kakšen je rezultat izvedbe:

(koda_07.png)

Izpis vedno prilagodimo našim potrebam in željam.

SET/GET metode

Če želimo, da se naš objekt obnaša kot črna škatla potrebujemo še metode za nastavljanje stanj (SET metode) in metode za dostop do stanj (GET metode).

Z metodami za nastavitev stanj lahko kontroliramo obnašanje našega objekta s tem, da onemogočimo neželjena stanja.

Poglejmo si primer, ko želimo v našem razredu Kolo preprečiti vnos negativnih vrednosti za ceno kolesa. Uporabili bomo SET metodo nastaviCeno. V primeru, da bo cena negativna bomo to sporočili uporabniku, drugače pa nastavimo ceno na vnešeno vrednost.

(koda_08.png)

Glede na uvedeno novo SET metodo bomo malo popravili tudi konstruktor, da bo tudi on "vedel" za novo kontrolo vnosa cene.

(koda_09.png)

Poglejmo, kako lahko sedaj nastavimo ceno kolesa:

(koda_10.png)

Na primeru si poglejmo še eno metodo za dostop do stanj (GET metoda). Da bo slika zaokrožena predstavimo kar metodo za dostop do cene kolesa. Metoda vrniCeno naj vrne ceno kolesa zaokroženo na dve decimalki:

(koda_11.png)

Pa si poglejmo še rezultat metode, ki nam vrne ceno. Cena je nastavljena v prejšnjem koraku s SET metodo, predstavljen podatek pa je res cena zaokrožena na dve decimalki.

(koda_12.png)

Seveda pa lahko v svojem razredu definiramo še druge metode, ki nam bodo prišle prav. V razredu Kolo bi si mogoče kasneje želeli tudi takšno metodo, ki bi vrnila število koles znamke Pinarello. Možnosti so neomejene.

Razred Kolo

Pridobljeno znanje o gradnji razreda Kolo lahko razširimo in dobimo uporabnejši primer in boljšo predstavo o tem, kaj nam prinese objektno orientirano programiranje.

Razred Kolo je definiran v datoteki, ki je dostopna tukaj:

knjKolo.py

Uporaba razreda Kolo pa je tukaj:

kolo_test.py

Ker je razred Kolo zapisan v datoteki knjKolo.py moramo le-to navesti v datoteki kolo_test.py tako, da napišemo v prvi vrstici import knjKolo. V nadaljevanju pa se sklicujemo na razred Kolo tako, da pred njim napišemo še knjKolo, npr. knjKolo.Kolo().

0%
0%