Objektorientert programmering i Python IN1000 Høst 2017 uke 9 Siri Moe Jensen Innhold uke 9 Tema: Mer komplekse strukturer Referanser versus objekter Referanser mellom objekter Lister av objekter inkl lister Ordbøker med referanser til objekter Ordbøker med lister Om ukens pensum Ingenting helt nytt (mht Python elementer)! MEN Mer detaljer om hva som faktisk skjer Nye kombinasjoner av elementer og mekanismer dere har sett og brukt før Referanser og objekter En variabel som lagrer objekter er som alle andre variabler, men: Innholdet i variabelen er ikke det objektet vi er ute etter men adressen dit (en referanse, ofte tegnet som en pil) Printer vi referansen, får vi en (litt kryptisk) melding ut Vanskelig? To angrepsmåter Intuisjon, gjenkjenning, se på eksempler Forståelse, detaljkunnskap, «code tracing» antall 5 Teori & praksis (programmering): Må kombineres! Resten av semesteret handler om dette => Mengde, mengde, mengde print() 1
Referanser og objekter Når vi tilordner noe til en heltallsvariabel, får den en ny verdi (heltall) antall = 3 «dot notasjon» For å endre (eller lese av) innholdet i objektet, kaller vi på metoder for det objektet vi er interessert i. Metoden adresserer vi med «dot notasjon» på referansevariabelen. Når vi tilordner noe til en referansevariabele, får den en ny verdi (referanse til et nytt objekt evt None). = rek2 # objektene endres ikke.reduser(1,1) print(.areal()) # angir objekt og metode antall 53 rek2 rek2 _lengde = 35 _bredde= 510 _lengde = 35 4 _bredde= 510 9 «dot notasjon» i flere ledd For å aksessere et objekt trenger vi altså en referanse, og en "public" metode som er tilgjengelig i grensesnittet til objektet (som definert av klassen) Referansen kan ligge i en variabel (som ) eller være en returverdi fra en funksjon eller metode (som igjen kan være kallt på en referanse som var returverdi fra en metode osv osv) Samlinger av verdier Beholdere (containers) er viktige verktøy i programmering Gjør det mulig å organisere samlinger av ulike typer verdier Containere tilbyr ulike egenskaper velger ut fra behov from rektangel import Rektangel print(rektangel(10,15).areal()) # Oppretter nytt Rektangel objekt og # kaller på metoden areal for dette, # printer til slutt returverdi fra areal Så langt har vi sett på Lister (List). Rekkefølge, nummerert Mengder (Set). Unummerert, uten dubletter Ordbøker (Dictionary). Par av nøkkel (typisk tekst) verdi _lengde = 10 _bredde= 15 2
Liste av lister: Referanser i flere ledd counts inneholder en referanse til en liste listen inneholder referanser til andre lister innholdet i disse listene hentes ut med f eks counts[5][0] Liste av lister: Indeksering Vi kan tenke oss strukturen som en tabell med generiske indekser 10/17/2017 Page 9 Eksempel: Informatikk emner (kurs) Vi skal lage et program for å velge informatikk emner Initielle krav: Kunne liste opp alle emner med id (emnekode), antall poeng og høst eller vår semester Designer en klasse Emne med instansvariable som over Bruker en liste for å organisere Emne objekter En klasse for emner class Emne : def init (self,emnekode,sem, stp) : self._semester self._emnekode = sem emnekode self._emnekode self._semester = emnekode sem self._studiepoeng = stp*2 def skrivut (self) : linje = (self._emnekode "(" + "(" + self._semester + "): " + \\ str(self._studiepoeng) + " studiepoeng") print(linje) 3
Samlinger av objekter Mer presist: Samlinger av objekt referanser. Objektene kan også være av klasser vi har skrevet selv (ikke bare f eks lister) Eks: En liste av Emne objekter (referanser til) Dictionaries (ordbøker, maps) kan også ha referanser som verdier, typisk med en instansvariabel fra objektet som nøkkel Eks: Dictionary med Emne objekter Nøkkel: Emnekode Verdi: Referanse til objektet for det emnet Liste med objekter av egen klasse Eksempel: ifiemner Hvert element i listen er (en referanse til) et emne objekt ifiemner = [] ifiemner.append(emne("in1000","host",10)) ifiemner.append(emne("","var",10)) #..osv osv for ettemne in ifiemner : ettemne.skrivut() ifiemner :List 0 1 IN1000 Opprette Dictionary (ordbok) Et program som slår opp telefonnummer Bruker en ordbok der navn er nøkkel, og telefonnummer er verdien contacts = { "Fred": 7235591, "Mary": 3841212, "Bob": 3841212, "Sarah": 2213278 } Ordbok med referanser Verdiene i en ordbok (dictionary) kan være referanser til objekter Eksempel: Ordbok ifiemner med emner Nøkkel (entydig): Emnekode Verdi: Referanse til et Emne objekt 10/17/2017 Page 15 4
Ordbok med referanser II ifiemner = {} #opprettet tom katalog while <flere emner> : <les inn emnekode, semester og poeng> nytt = Emne(emnekode,semester,poeng) ifiemner [emnekode] = nytt ifiemner :Dictionary IN1001 IN2220 IN1001 IN2220 5