Objektorientert programmering i Python

Like dokumenter
Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

Læringsmål uke 7. Introduksjon til objektorientert programmering. Paradigmet objektorientering. Objektreferanser. INF1001 Høst 2016 Uke 7

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

Hvorfor objektorientert programmering?

Innhold uke 9. Objektorientert programmering i Python. Om ukens pensum. Referanser og objekter Tema: Mer komplekse strukturer

Læringsmål uke 7. Objektorientert programmering i Python: Introduksjon. Innhold uke 7. Lite tilbakeblikk: Programflyt og skop

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Etter uke 9 skal du. Introduksjon til objektorientert programmering. Innhold. Klasser som abstraksjoner

Informasjon Prøveeksamen i IN1000 høsten 2018

Innhold uke 10. Objektorientert programmering i Python. Oblig 7 og 8. IN1000 Seminar! IN1000 Høst 2018 uke 10 Siri Moe Jensen

Informasjon Eksamen i IN1000 høsten 2017

IN1000 Obligatorisk innlevering 7

Introduksjon til objektorientert programmering

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

UNIVERSITETET I OSLO

Løse reelle problemer

UNIVERSITETET I OSLO

Innhold. Hva skal evalueres? Fra kurssidene. Kapittel 1: Introduction

Løse reelle problemer

INF1000 Eksamen 2014 (modifisert)

Finne ut om en løsning er helt riktig og korrigere ved behov


Eksamensoppgaver 2014

Seminaroppgaver IN1010, uke 2

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Klasser og objekter. Tuva Kristine Thoresen 4. november Institutt for Informatikk

IN Seminaroppgaver til uke 11

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Hvordan løse problemer med programmering?

Finne ut om en løsning er helt riktig og korrigere ved behov

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1000 Eksamen 2014 (modifisert)

Innhold. IN1000 Høst Hva skal evalueres? Fra kurssidene. Uke 12: Pensumgjennomgang og eksamenstips

Øvingsforelesning 1 Python (TDT4110)

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Ch.7: Innføring i klasser

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

2 Om statiske variable/konstanter og statiske metoder.

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

UNIVERSITETET I OSLO

INF våren 2017

IN1010 V19, Obligatorisk oppgave 2

INF Uke 10. Ukesoppgaver oktober 2012

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

Velkommen til. IN1010 Objektorientert programmering Våren 2018

Obligatorisk oppgave 4: Lege/Resept

UNIVERSITETET I OSLO

INF Obligatorisk innlevering 7

Velkommen til. INF våren 2017

Utførelse av programmer, metoder og synlighet av variabler i JSP

UNIVERSITETET I OSLO

Python: Funksjoner og moduler Kapittel

Klasser og objekter. Tuva Kristine Thoresen 21. oktober Institutt for Informatikk

TDT4110 IT Grunnkurs Høst 2015

TDT4110 IT Grunnkurs Høst 2016

INF Obligatorisk innlevering 5

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000 Prøveeksamen Oppgave 7 og 9

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Oppsummering fra sist

IN1010 V18, Obligatorisk oppgave 5

UNIVERSITETET I OSLO

Python: Strenger 3. utgave: Kapittel 8

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

INF1000: Forelesning 7. Konstruktører Static

INF Obligatorisk innlevering 7 - Hangman

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

UNIVERSITETET I OSLO

Programmering i C++ Løsningsforslag Eksamen høsten 2005

2 Om statiske variable/konstanter og statiske metoder.

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Et større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

INF Innleveringsoppgave 6

INF1010 siste begreper før oblig 2

TDT4110 IT Grunnkurs Høst 2016

MAT-INF 1100: Obligatorisk oppgave 1

Oppgave 1.1 (1 poeng) Oppgave 1.2 (2 poeng) Oppgave 1.3 (2 poeng) 1.1

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

UNIVERSITETET I OSLO

Øvingsforelesning 5 Python (TDT4110)

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

INF2810: Funksjonell Programmering

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

OPPGAVESETT 7 OBJEKTER OG REFERANSER

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

Håndtere mange verdier

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering

IN1010 Objektorientert programmering Våren 2019

Transkript:

Objektorientert programmering i Python IN1000 Høst 2019 uke 8 Siri Moe Jensen Læringsmål uke 8 Repetisjon fra forrige uke Definere en klasse, opprette og arbeide med objekter: How-to <Se ordliste på semestersiden for terminologi> Forstå (mer av) hva som skjer bak kulissene når vi oppretter og bruker objekter Kjenne til referansevariabler og hvordan de fungerer Kunne manipulere referanser og vite hvordan None brukes Kunne skrive programmer med flere objekter av samme klasse, sette seg inn i programmer med flere klasser Obliger Godkjenning Oblig 1-6 Devilry vil være oppdatert ila neste uke Kan gå gjennom egne innleveringer og sjekke poengsum (>=19) Både oblig 7 og oblig 8 må godkjennes for å gå opp til eksamen Se tekst og lenker på semestersiden (under Obligatoriske innleveringer) om krav til eget arbeid: Samarbeid om teori og andre oppgaver skriv egen kode. Lever i god tid i tilfelle tekniske problemer eller annet. Hvis du leverer flere ganger er det siste versjon som gjelder. Å definere en klasse, opprette objekter og kalle på metoder class Student: def init (self): self._poeng = 0 def registrer(self): self._poeng += 1 def hentpoeng(self): funksjons-metode return self._hentpoeng nystudent = Student() nystudent.registrer() klassenavn nytt objekt konstruktør metode metodekall på objektet 1

..og hvordan opprette et objekt? Opprette objekter av egen klasse: nystudent _antmott 0 nystudent = Student() Program med prosedyrer og funksjoner mittprogram.py def prosedyre (p1, p2,..): Noen innebygde klasser har snarveier for opprettelse av objekter (i stedet for klassenavnet) "" oppretter en ny str [] oppretter en ny list def funksjon (p1, p2,): return def hovedprogram (): # Kall på funksjon # Kall på prosedyre parameterverdier returverdier hovedprogram() Program med klasser mittklasseprogram.py class Student: def init (self,p1): self._instvar1 = p1 self._instvar2 = 3.14 def metode1 (self, p2,..): def hovedprogram (): # oppretter og bruker objekter Kodeflyt og data class Student : def init (self): self._poeng = 0 def registrer(self): self._poeng += 1 def hentpoeng(self): return self._poeng nystudent = Student() Data <husk klassenavn og metoder> hovedprogram() 2

Kodeflyt og data Programmet med kodelinjer class Student : def init (self) : self._poeng = 0 Data <husk klassenavn og metoder> nystudent self Representasjon av verdier i Python En variabel kan sees på som en "boks" som inneholder en verdi et heltall, True eller False, eller et flyttall def registrer(self) : self._poeng += 1 def hentpoeng(self) : return self._poeng nystudent = Student() For variabler som representerer objekter trengs det et litt mer detaljert bilde Slike variabler inneholder ikke objektet selv men en referanse til objektet Objekter lagres ikke direkte i variable variablene inneholder isteden bare referansen (minne-adressen) til objektet. Litt nærmere sannheten (men veldig tungvint på tegninger...) : <adr> <adr i minnet> 0x00000128943ac710 Minne-adresse: 0x00000128943ac710 => Vi kommer til å holde oss til denne! Tegnes ofte som en pil for å indikere at objektet ikke selv ligger i variabelen men at variabelen kan "vise vei". Minneadressen innholdet i variabelen er en objektreferanse eller bare referanse 3

Variabler som holder rede på objekter kalles referansevariabler Gjør det mulig å ta vare på og bruke objekter når vi trenger dem, akkurat som heltallsvariabler husker heltall til vi trenger dem. Selve objektet kan lagres "hvorsomhelst" i minnet, og være stort eller lite referansevariabelen trenger bare plass til en adresse Ofte trenger vi ikke tenke på at selve objektet ikke ligger i variabelen Men noen ganger er det viktig å ta hensyn til at referansen og objektet er to ulike ting! Hva skjer for eksempel om vi tilordner verdien fra en referansevariabel til en annen? = Student() stud2 = Referansevariabler kan brukes for å kalle på metoder i objektet: refvariabel.metode() stud2? stud2? = Student() stud2 = stud2.registrer() print (.hentpoeng()) _poeng 10 => Hva skrives ut i print-setningen? Situasjonen før rød pil utføres Noen objekter kan ikke endres Noen klasser har ikke metoder som endrer instansvariablene, de kalles immutable "uforanderlige" Hindrer feil som følge av at flere variable refererer til samme objekt Streng-objekter er et eksempel på dette alle metoder som endrer returnerer et NYTT objekt i stedet for å endre det eksisterende objektet Må se på dokumentasjonen av klassens grensesnitt for å vite # Strenger er immutable, returnerer en endret kopi navnmedsmaabokstaver = navn.lower() # Lister er mutable objektet endres liste.append("per") 4

Kode og tegninger nyttig med tegninger når datastrukturene blir mer kompliserte etter hvert Eksempel: Klassen Rektangel Rektangler er nyttige elementer i mange sammenhenger variable tegnes som en navngitt boks med verdi inni objekter tegnes som rektangler med runde kanter referanser tegnes som piler fra variable alder 18 : Student => Mulighet for gjenbruk Skriv en klasse Rektangel som Har en konstruktør som tar to parametre: lengde og bredde En metode areal som returnerer rektangelets areal En metode endre som endrer størrelsen på rektangelet og har to parametere - lengde og bredde som angir hvor mye sidene i rektangelet skal endres med Klassen Rektangel class Rektangel: def areal(self) : return self._lengde*self._bredde def endre (self, lengde, bredde): self._lengde +=lengde self._bredde += bredde Hva skjer når vi oppretter objekter? class Rektangel: rek1 = Rektangel(5,2) rek2 = Rektangel (8,3) rek1 self lengde 5 _lengde = 5 _bredde = 2 bredde 2 5

Hva skjer når vi oppretter objekter? class Rektangel : rek1 = Rektangel(5,2) rek2 = Rektangel (8,3) rek1 rek2 _lengde = 5 _bredde = 2 _lengde = 8 _bredde = 3 Hva skjer når vi kaller metoder? class Rektangel : def areal(self) : return self._lengde*self._bredde def endre(self,lengde,bredde): self._lengde +=lengde self._bredde += bredde rek3 = Rektangel(5,2) print (rek3.areal()) rek3.endre(-2,-1) print (rek3.areal()) rek3 self Kjøring _lengde = 53 _bredde = 21 M:> python testrektangel.py 10 3 M:> Metoder kan endre, lese og bruke egenskapene til objektet de kalles på rek3 self _lengde = 53 _bredde = 21 Lokale variabler i metoder Hører ikke til objektet slik som instansvariablene Oppstår og dør hver gang metoden kalles (som i funksjoner) rek3 = Rektangel(5,2) print (rek3.areal()) rek3.endre(-2,-1) print (rek3.areal()) Nytt kall på areal gir en annen verdi fordi objektets egenskaper er endret I metoden areal gjør objektet en beregning for oss som vi bruker på kallstedet Metoden endre endrer egenskapene i objektet, som forblir endret etter metoden avsluttes class Rektangel: def areal(self): areal = self._lengde*self._bredde return areal 6

Verdien None Eksempel: Navn Verdien None signaliserer at en referansevariabel ikke holder på noe objekt i øyeblikket. None kan være en nyttig initialverdi Kan være nødvendig å sjekke mot None for å unngå å kalle på en metode i et objekt som ikke finnes (gir feil under kjøring) rek3 = None areal = rek3.areal() if rek3 is not None: areal = rek3.areal() Skriv en klasse Navn som skal huske og presentere på flere formater navn bestående av fornavn, mellomnavn og etternavn Uformelt grensesnitt Konstruktør m/ parametere for for-, mellom- og etternavn Metoder for å hente på form egnet for sortering (Hareide, Knut Arild) hente naturlig (Knut Arild Hareide) Klassen Navn implementert Filen navn.py class Navn: def init (self,fornavn,mellom,etter): self._fornavn = fornavn self._mellom = mellom self._etter = etter def sortert(self): alfnavn = self._etter + ", "\ + self._fornavn + " " + self._mellom return alfnavn def naturlig(self): natnavn = self._fornavn + " "\ + self._mellom + " " + self._etter return natnavn Klassen Navn: Testprogram navn1 navn2 navn1 = Navn("Siri", "Moe", "Jensen") navn2 = Navn("Geir", "Kjetil", "Sandve") print (navn1.sortert()) print (navn2.sortert()) print (navn2.naturlig()) _fornavn = Siri _mellom = Moe _etter = Jensen _fornavn = Geir _mellom = Kjetil _etter = Sandve 7

Flere objekter av samme klasse En klasse er et mønster å lage objekter av Nyttig for å representere mange "ting" som følger samme mønster, for eksempel navn: navneliste = [] while les!= "" : navnene = les.split() nytt = Navn(navnene[0],navnene[1],navnene[2]) navneliste.append(nytt) for navn in navneliste : print(navn.sortert()) Eksempel: Klasse Person Skal lagre og skrive ut data om en person Navn Alder (og mye mer etter hvert) class Person: def init (self,fulltnavn,alder): def skrivut(self): Vil gjenbruke klassen vi har laget for navn Implementasjon av Person Hvordan representere navnet til personen i klassen? Kan ha en instansvariabel som inneholder en tekst... men da vet vi ingenting om hvordan navnet er bygd opp velger å bruke vår klasse Navn som en mer intelligent og fleksibel representasjon av personnavn Implementasjon av Person Filen person.py class Person: def init (self,fulltnavn,alder): self._navn = fulltnavn self._alder = alder def skrivut(self): print ("Navn: " + self._navn.naturlig() ) print ("Alder: " + str(self._alder)) Hvert Person-objekt får en instansvariabel som refererer et Navn-objekt Da kan et Person-objekt oppgi navnet sitt på flere former! eksempelperson _navn _alder 18 _fornavn = aa _mellom = bb _etter = ccc 8

Klassen Person: Testprogram from person import Person Testprogram: Flere navn foreleser1 foreleser2 navn1 = Navn("Siri", "Moe", "Jensen") foreleser1 = Person(navn1, 29) navn2 = Navn("Geir", "Kjetil", "Sandve") foreleser2 = Person(navn2, 25) foreleser1.skrivut() foreleser2.skrivut() _navn _alder 29 _navn _alder 25 navn1 _fornavn = Siri _mellom = Moe _etter = Jensen _fornavn = Geir _mellom = Kjetil _etter = Sandve navn2 navneliste = [] while les!= "" : navnene = les.split() nytt = Navn(navnene[0],navnene[1],navnene[2]) navneliste.append(nytt) for navn in navneliste : print(navn.sortert()) Testprogram: Flere personer Neste uke from person import Person personliste = [] while les!= "" : navnene = les.split() nytt = Navn(navnene[0],navnene[1],navnene[2]) alder = int(input("oppgi alder: ")) nyperson = Person(nytt, alder) personliste.append(nyperson) for person in personliste : person.skrivut() print("\n") "Magiske metoder" for egendefinerte klasser Hvordan representere objekter som en streng? Hvordan sjekke om to objekter er "like"? Objekter i ulike strukturer Samlinger av objekter Referanser mellom objekter Referanser mellom objekter av ulike klasser 9