180 likes | 359 Vues
Python - OOP. Objekti. Ustvarjanje objektov. Razred je šablona, ki definira spremenljivke in metode skupne vsem objektom iste vrste . Dejansko gre za definiranje novega tipa podatkov class Načrt objekta, šablona Primerek razreda (instanca) – konkretni objekt
E N D
Python - OOP Objekti
Ustvarjanje objektov • Razred je šablona, ki definira spremenljivke in metode skupne vsem objektom iste vrste. • Dejansko gre za definiranje novega tipa podatkov • class • Načrt objekta, šablona • Primerek razreda (instanca) – konkretni objekt • Ustvarimo ga z ImeKn.ImeRazreda(morebitni parametri metode __init__) • Brez tega objekta NE MOREMO uporabiti • Ker ga ni ;-) • a = ImeKn.ImeRazreda() • aje IME objekta • natančneje • a je ime spremenljivke, kjer hranimo NASLOV objekta vrste ImeRazreda
Problem • Banka Butale se intenzivno pripravlja na prihod nove valute arve • Med drugim bo potrebno nakovati nove kovance • Za ustrezno informacijsko podporo kovačnici najamejo tebe • Po nekajmesečnih pogovorih ugotoviš: • Potrebovali bomo objekte vrste Kovanec • Potrebujemo torej razred Kovanec
Kako do svojega razreda Na tržišču ni niti približno ustreznega razreda
Naredimo razred • Analiza • Pa ne matematični predmet • Katera so stanja/lastnosti • Kaj hočemo o objektih te vrste vedeti • Kakšne lastnosti imajo • Katere so metode • Kakšno je “znanje” objektov • Na katere “ukaze” se odzovejo • Način uporabe lastnosti objekta (podatke o objektu) skrijemo • Enkapsulacija • Pomeni dvoje • Združevanje podatkov "pod eno streho" (v isti kapsuli) • Združeni podatki in metode
Okostje razreda classRazred : # konstruktor z deklaracijo lastnosti - komponent # atributov - polj - ... # metode # __str__, __ repr __
Razredi in objekti • Sestavimo razred Kovanec, s katerim predstavimo kovance. • Naredimo analizo: • Denimo, da so kovanci okrogli, z danim polmerom in višino. Poleg konstruktorja in standardnih metod, ki nastavijo in vrnejo vrednosti lastnosti in za pretvorbo v niz, naj razred pozna še metodi, ki vrneta površino in volumen kovanca. • Odločitev o načinu predstavitve podatkov • Kje, kako bomo podatke (polmer, višina) hranili
Kovanec classKovanec : # konstruktor def __init__(self, r = 1, v = 1) # int polmer # intvisina #"SET" metode defnastaviPolmer(self, r) defnastaviVisino(self, visina) # "GET" metode defpovejPolmer(self) defpovejVisino(self) # v niz def __str__(self) # kako je objekt “videti” kot niz def __repr__(self) # kako je objekt “predstavljen” # "znanje" def volumen(self) defpovrsina(self) le navedba metod
Kovanec class Kovanec : # konstruktor def __init__(self, r = 1, v = 1) # int polmer # intvisina # "SET" metode defnastaviPolmer(self, r) : self.polmer = r defnastaviVisino(self, visina) : # smiselna visina je le med 1 in 100 # drugače jo pustimo pri miru if 1 <= visina <= 100 : self.visina = visina # "GET" metode defpovejPolmer(self) : returnself.polmer defpovejVisino(self) : returnself.visina # v niz def __str__(self) : # kako je objekt “videti” kot niz return 'r = ' + str(self.povejPolmer()) + '\nvisina = ' + str(self.povejVisino()) def __repr__(self) : # kako je objekt “predstavljen” return '(' + str(self.povejPolmer()) + ', ' + str(self.povejVisino()) + ')' # "znanje" def volumen(self) defpovrsina(self) le skica
Uporaba • Državna kovnica te najame, da napišeš program, ki reši naslednji problem • Ali lahko iz bakrenega kvadra velikosti 20 x 12 x 30 naredimo n "običajnih" kovancev? • interpretacija odgovorov (DA/NE) • ne: nikakor to ne gre • da: mogoče, ni pa nujno • Kovanec() ustvari nov, “običajni” kovanec.
Kovanci importknjiznica kvader_x = 20 kvader_y = 12 kvader_z = 30 volumenKvadra= kvader_x * kvader_y * kvader_z n = int(input('Koliko kovancev potrebujemo: ')) enKovanec= knjiznica.Kovanec() volKovanca= enKovanec.volumen() if(volumenKvadra > n * volKovanca) : print('DA') else : print('NE')
Uporaba • Državni zakladnik spremeni dimenzije "običajnih" kovancev. Je potrebno spremeniti tvoj program? Kje so potrebne spremembe? • Razrede sestavljamo tako, da uporabniki tega razreda niso prizadeti ob morebitnih spremembah razredov • Glave metod pustimo enake • Uporabniški programi ostanejo enaki • Potrebujejo le nove različice knjižnic • Za uporabnika se s tem dejansko ne spremeni nič!
Razred Kvader • Geometrijsko telo • Podatki • Komponente • opisujejo stanje objekta • Metode • Konstruktor (posebna metoda __init__) • Kaj se zgodi ko ustvarimo objekt • “znanje” objektov tega razreda • volumen, površina, ... • Metode za ravnanje s podatki • Nastavi podatek • Vrni podatek • __str__ Komponente:stranice • Metode: • konstruktor • volumen • povrsina • stranicaA • stranicaB • stranicaC • kolikoA • …
Kvader - podatki • Podatki: • Stranice: a, b, c • Odločitev o načinu predstavitve • Kako bo imel objekt predstavljene stranice • Ena od možnosti: • 3x spremenljivka tipa int • Druga možnost • Seznam s tremi polji • Tretja možnost: ….
Zakaj enkapsulacija? • Način predstavitve uporabnika NE SME (;-) ) zanimati • Zato za dostop do lastnosti • Pripravimo ustrezne metode • Če se podpisi metod ne spreminjajo – ni težav s spreminjanjem razreda • Vsi programi, ki uporabljajo objekte določenega razreda, si podatke izmenjujejo le preko metod • Če se klic ne bo spremenil, je vseeno, kako je spremenjen razred!
Kvader – metode za delo s podatki • Za podatke, za katere je smiselno, da jih uporabnik vidi: • Metode, ki povejo vrednost podatka • povejA(), … • Za podatke, za katere je smiselno, da jih uporabnik spremeni: • Metode, ki spremenijo vrednost podatka • Možnost kontrole • stranicaA(), …
Kvader - konstruktor • Standardno – konstruktor brez parametrov • Naredi “privzeti” objekt • Denimo – kvader s stranicami 1 x 1 x 1 • def __init__(self) :self.a= 1self.b= 1 self.c= 1 • Kaj pa, če bi uporabniku radi ponudili več možnosti “začetnega” kvadra? • Uporaba parametrov s privzetimi vrednostmi • def __init__(self, a = 1, b = 1, c = 1) :self.a = aself.b = b self.c = c
__str__ • Metoda, ki se uporabi avtomatično, če moramo objekt spremeniti v niz • Vedno obstaja (dedovanje), a verjetno nekoristna • Zato običajno – sestavljamo sami def __str__(self) : opis = str(self.a) + ' x ' opis = opis + str(self.b) + ' x ' opis = opis + str(self.c) return opis