270 likes | 470 Views
Objektno programiranje. V Pythonu. Objekti. Objekt je skupek podatkov, s katerim želimo upravljati kot s celoto. Ima Podatke Kakšno je stanje (state) objekta kaj o objektu vemo/hranimo stalni podatki / spremenljivi podatki Metode Kakšno je obnašanje (behaviour) objekta
E N D
Objektno programiranje V Pythonu
Objekti • Objekt je skupek podatkov, s katerim želimo upravljati kot s celoto. • Ima • Podatke • Kakšno je stanje (state) objekta • kaj o objektu vemo/hranimo • stalni podatki / spremenljivi podatki • Metode • Kakšno je obnašanje (behaviour) objekta • Kaj objekt "zna" • Kakšne metode lahko izvajamo nad njem • Vsak objekt pripada nekemu razredu. Če pripada objekt x razredu R, potem pravimo tudi da je x objekt tipa R.
Znani objekti • Nekaj primerov objektov jezika Python:, ki smo jih že uporabljali • Objekt tipa list predstavlja seznam. Kadar želimo dodati element v seznam, kličemo njegovo metodo append. Če je npr. sez neka seznam, podatek dodamo s sez.append('Novo') • Objekt os.pathpredstavlja sistemsko pot. Kadar želimo izvedeti, ali je nekaj datoteka, pokličemo metodo isFilena objektu os.path. (os.path.isFile('v.txt')) • Objekt tipa Canvaspredstavlja platno v oknu, kjer lahko rišemo. Če želimo narisati na platnu pravokotnik, kličemo njegovo metodo create_rectangle (platno.create_reactangle(0,0,100,100)) • Seveda pa so objekti uporabni predvsem zato, ker lahko programer definira nove razrede in objekte.
Objekti • stanja: • Lastnosti, podatki, komponente • “znanje” • Odzivanje na ukaze • nekObjekt.metoda(…) • Združeno v celoto • Podatki in metode, ki opisujejo neko stvar/objekt • Žoga: • Podatki: velikost, barva, položaj v prostoru … • Metode: sprememba velikosti, sprememba položaja … • Ulomek: • Podatki: števec, imenovalec • Metode: spremeni števec, spremeni imenovalec, seštej, obratna vrednost, lepo izpiši ...
Primeri objektov • Datum • V objektih tipa datum bi npr. hranili datume • Podatki (stanje objekta) • Dan, mesec, leto • Metode (obnašanje / znanje) • Vrni mesec • Vrni število dni med dvema datumoma • Naslednji dan • Prejšnji dan • Lepo izpiši • Je leto prestopno • Dan v tednu na določen datum • ...
Avto • Podatki • tehnične značilnosti: • največjaHitrost (v km/h), • velikostRezervoarja (v litrih) • povprečnaPoraba (v litrih/100 km). • trenutno stanje avtomobila • Je avto vžgan (da/ne) • Koliko je na števcu km (npr. 234.142 km), • Trenutna hitrost (npr. 56.12 km/h) • Količina Goriva (npr. 14.325 litrov). • "Obnašanje" • Vžgi avto (spremeni stanje "vžganosti") • Ugasni avto (spremeni stanje "vžganosti") • "dej gas" (spremeni stanje hitrost) • "bremzej" • Natankaj gorivo • Povej, za koliko km še zadošča gorivo • ...
Primer problema • Napisati morate program, ki bo nadzoroval delovanje dvigal • Objekt Dvigalo • Podatki (stanje) objekta: • V katerem nadstropju je, • koliko oseb je v njemu • kakšna je masa teh oseb. • Delovanje dvigala ("znanje", "obnašanje") • vstop oseb v dvigalo, • izstop • premik gor ali dol
Primer problema • Vodimo skladišče kontejnerjev • Radi bi napisali program, ki bi znal odgovoriti na določena vprašanja • Izpis vsebine vseh polnih kontejnerjev • Koliko je povsem praznih kontejnerjev • Vsebina največjega kontejnerja • …
Razred Kontejner • Tabela kontejnerjev • Posamezni kontejner • Nov razred • Za vsak kontejner poznamo • Mere • Zapolnjenost (v %) • Vsebino • Kaj počnemo s posameznim kontejnerjem • Napolni z določeno vsebino • Poizvedi, koliko je zaseden • Dodaj vsebino • Izpiši vsebino • Poizvedi po merah
Objekti • Objekt je kakršenkoli skupek podatkov, s katerimi želimo upravljati. • Osnovni pristop objektnega programiranja • objekt = podatki + metode za delo s podatki. • Ko želimo kak podatek (objekt) obdelati, objektu (podatku) signaliziramo, kaj naj se zgodi. • Pokličemo ustrezno metodo v objektu. • Objekt je "črna škatla“, ki sprejema in pošilja sporočila. Jedro objekta sestavljajo njegove spremenljivke, okrog katerih se nahajajo njegove metode.
Princip črne škatle • Imamo objekt janez, ki hrani podatke o neki osebi. • Zanima nas inteligenčni količnik te osebe. • janez.kolikoJeIQ() • Objekt se odzove z odgovorom • Uporabnika ne zanima, kako je objekt prišel do odgovora, le kaj ga lahko vpraša in v kakšni obliki bo dobil odgovor! • Ni važno, kako je objekt odgovoril – kako je prišel do IQ (je to podatek, ki je zapisan nekje v objektu, je to rezultat nekega preračunavanja … 92 Koliko je tvoj IQ ?
Prednosti "črne škatle" • Če kasneje spremenimo notranjost "črne škatle" (razreda) • Spremembe v programih, ki razred uporabljajo, niso potrebne • Seveda, če je način spraševanja in odgovarjanja ostal nespremenjen • Če so metode ostale enake (imajo enaka imena, nabor parametrov in tip rezultata) • Npr.: • Šef ugotovi, da bi bilo smiselno, da v vaših programih pri datumu hranite še čas. Ampak stvari naj bi naredili tako, da obstoječi programi ne bi bili prizadeti (beri, da bi delali še naprej) • Če je razred "črna" škatla, lahko naredimo spremembe tako, da ne bo "staro" prizadeto • Pomislite samo na "običajno življenje" • Verjetno je zgradba menjalnika danes bistveno drugačna, kot je bila pred 30 leti • A kar se šoferja (starega ;-) ) tiče, se ni nič spremenilo – s to črno škatlo (menjalnikom) upravlja še vedno na enak način kot pred 30 leti • Če se bodo v Python 2013 odločili, da razred listspremenijo (spremenijo notranjost "črne škatle"), a bomo še vedno imeli metodo append, se za programerja ne bo nič spremenilo, čeprav bo metoda append morda "znotraj" delala drugače!
Od kje razredi? • Veliko vgrajenih (oziroma v standardnih knjižnicah) v Python • Drugi viri • Naši “stari” programi • Drugi programerji • Potrebujemo dostop do ustrezne datoteke (import)
Moj prvi razred Oglejmo si naslednji program: class MojRazred : def __init__(self, sporočilo) : self.vsebina = sporočilo def izpiši(self) : print(self.vsebina) # s tem smodefiniralinovrazredMojrazred # uporaba objektMojR = MojRazred("Objektnoprogramiranje v vsakoslovensko vas!") objektMojR.izpiši() Definicija razreda Naredimo objekt Oznaka objekta ukazujemo objektu
Objekt in ime spremenljivke • nekiObjekt = NekiRazred() • V pomnilniku se je naredil objekt tipa NekiRazred in nekiObjekt kaže na ta novo ustvarjeni objekt
Python in objekti • Razred (class) je opis vrste objekta (načrt, kako naj bo objekt videti) – opis ideje objekta • Primerek razreda (instanca) – konkretni objekt Neki(12, 89, 24, "red", … class Neki :…
Ustvarjanje objektov • ime = Ulomek(3, 4) • Rečemo: • V objektu ime je shranjen ulomek ¾; • Točneje • V spremenljivki ime je naslov nekega objekta tipa Ulomek, ki predstavlja ulomek ¾. • Spremenljivka ime kaže na objekt tipa Ulomek, ki …
Še en zgled • Poglejmo si še en zgled. Denimo, da bi radi napisali program, ki bo prebral nek ulomek in mu prištel 1/2. • Torej, če imamo ulomek 2/3 bi ga radi povečali za 1/2. • Matematično • ul = 2/3 • ul = ul + 1/2 • "klasično" se bomo tega lotili takole
Povečaj ulomek "klasično" # vnos podatkov beri = input("Števec ulomka: ") števec = int(beri) beri = input("Imenovalec ulomka: ") imenovalec = int(beri) # izpis print("Ulomek je: " + str(števec) + " / " + str(imenovalec)) # "delo" števec = števec+ 1 imenovalec = imenovalec + 2 # izpis print("Nov ulomek je: " + str(števec) + " / " + str(imenovalec))
Povečaj ulomek - objektno • Razred Ulomek • Hrani podatke o svojem števcu in imenovalcu • "se zna" povečati za drug ulomek • Vsebuje metodo, ki ta ulomek poveča za drug ulomek
Ulomki - objektno class Ulomek : def __init__(self, st, im) : self.števec= st self.imenovalec = im defprištej(self, ulP) : self.števec= self.števec+ ulP.števec self.imenovalec = self.imenovalec + ulP.imenovalec def izpis(self) : print(str(self.števec) + " / " + str(self.imenovalec), end='')
Ulomki - objektno # vnos podatkov beri = input("Števec ulomka: ") štev = int(beri) beri = input("Imenovalec ulomka: ") imenovalec = int(beri) mojUl = Ulomek(štev, imenovalec) # izpis print("Ulomek je: ", end='') mojUl.izpis() print() # "delo" polovica = Ulomek(1, 2) mojUl.prištej(polovica) # izpis print("Spremenjeni ulomek je: ", end='') mojUl.izpis() print() Naredimo ulomek "Ukazujemo " ulomku
objektno # "delo" polovica = Ulomek(1, 2) mojUl.prištej(polovica) Primerjava • "klasično" # "delo" števec = števec+ 1 imenovalec = imenovalec + 2 Bolje? Pregledneje? Krajše?
Ulomek • Ampak – ulomke smo seštevali narobe, po "Janezkovo"! • Saj veste ... Inšpektor reče ... Saj se ulomki ne seštevajo tako, da se posebej seštejeta števec in imenovalec ... Učitelj Janezek pa ... Saj vem, ampak tako si lažje zapomnijo ... • Napisali pa smo že nekaj 10 programov z "Janezkovim seštevanjem" • Klasično: preko kode vseh 10 programov in "iščemo", kje smo pravzaprav seštevali • Objektno: le spremenimo metodo pristej v razredu Ulomek, nato pa • Nič, to je vse ...
In pri tem nismo niti omenili, da z ... class Ulomek : def __init__(self, st, im) : self.števec= st self.imenovalec= im def __add__(self, ulP) : novŠtevec = self.števec+ ulP.števec novImenovalec = self.imenovalec + ulP.imenovalec return Ulomek(novŠtevec, novImenovalec) def izpis(self) : print(str(self.števec) + " / " + str(self.imenovalec), end='')
Lahko počnemo ... # vnos podatkov beri = input("Števec ulomka: ") števec = int(beri) beri = input("Imenovalec ulomka: ") imenovalec = int(beri) mojUl = Ulomek(števec, imenovalec) # izpis print("Ulomek je: ", end='') mojUl.izpis() print() # "delo" polovica = Ulomek(1, 2) mojUl = mojUl + polovica # izpis print("Spremenjeni ulomek je: ", end='') mojUl.izpis() print()
Objektno programiranje • Problem • Z analizo ugotovimo, kakšne objekte potrebujemo za reševanje • Pregledamo, ali že imamo na voljo ustrezne razrede • Standardna knjižnica • Druge knjižnice • Naši stari razredi • Sestavimo ustrezne manjkajoče razrede • Sestavimo “glavni” program, kjer s pomočjo objektov rešimo problem