Objektno programiranje

Download Report

Transcript Objektno programiranje

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.
2
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.path predstavlja sistemsko pot. Kadar želimo
izvedeti, ali je nekaj datoteka, pokličemo metodo isFile na
objektu os.path. (os.path.isFile('v.txt'))
Objekt tipa Canvas predstavlja 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.
3
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 ...
4
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
...
5
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
...
6
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
7
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
…
8
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
9
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.
10
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 …
11
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 list spremenijo
(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!
12
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)
13
Moj prvi razred
Oglejmo si naslednji program:
class MojRazred :
def __init__(self, sporočilo) :
self.vsebina = sporočilo
Definicija razreda
def izpiši(self) :
print(self.vsebina)
# s tem smo definirali nov razred Mojrazred
# uporaba
Oznaka objekta
Naredimo objekt
objektMojR = MojRazred("Objektno programiranje v vsako slovensko vas!")
objektMojR.izpiši()
ukazujemo objektu
14
Objekt in ime spremenljivke
nekiObjekt = NekiRazred()
V pomnilniku se je naredil objekt tipa NekiRazred in
nekiObjekt kaže na ta novo ustvarjeni objekt
15
Python in objekti
Razred (class) je opis vrste objekta (načrt, kako naj bo objekt videti) – opis ideje
objekta
Primerek razreda (instanca) – konkretni objekt
class Neki :…
Neki(12, 89, 24, "red", …
16
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 …
17
Š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
18
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))
19
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
20
Ulomki - objektno
class Ulomek :
def __init__(self, st, im) :
self.števec = st
self.imenovalec = im
def priš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='')
21
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='')
Naredimo ulomek
mojUl.izpis()
print()
# "delo"
"Ukazujemo " ulomku
polovica = Ulomek(1, 2)
mojUl.prištej(polovica)
# izpis
print("Spremenjeni ulomek je: ", end='')
mojUl.izpis()
print()
22
Primerjava
objektno
"klasično"
# "delo"
števec = števec + 1
imenovalec = imenovalec + 2
# "delo"
polovica = Ulomek(1, 2)
mojUl.prištej(polovica)
Bolje? Pregledneje? Krajše?
23
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 ...
24
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='')
25
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()
26
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
27