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

Like dokumenter
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?

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

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

Objektorientert programmering i Python

Introduksjon til objektorientert programmering

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

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

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

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

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

IN våren 2019 Onsdag 16. januar

INF våren 2017

IN våren 2018 Tirsdag 16. januar

Velkommen! I dag. Viktige beskjeder. Studieadministrasjonen. IN Høst Siri Moe Jensen Geir Kjetil Sandve Henrik Hillestad

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

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

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

UNIVERSITETET I OSLO

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

UNIVERSITETET I OSLO

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

IN1000 Obligatorisk innlevering 7

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

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

Eksamensoppgaver 2014

2 Om statiske variable/konstanter og statiske metoder.

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF1000: Forelesning 6. Klasser og objekter del 1

INF2810: Funksjonell Programmering

Løse reelle problemer

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

INF2810: Funksjonell Programmering

Seminaroppgaver IN1010, uke 2

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

INF1000 Eksamen 2014 (modifisert)

Hva er en metode. Hva skjer når vi kaller en metode

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

Innhold. INF1000 Høst Hva skal evalueres? Fra kurssidene. Hvorfor har vi en lærebok? Uke 11: Repetisjon og pensumgjennomgang

Velkommen til. INF våren 2016

2 Om statiske variable/konstanter og statiske metoder.

INF1000: Forelesning 7. Konstruktører Static

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

INF Obligatorisk innlevering 5

UNIVERSITETET I OSLO

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

Ch.7: Innføring i klasser

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

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon


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

IN Seminaroppgaver til uke 11

Løse reelle problemer

INF Seminaroppgaver til uke 3

Informasjon Prøveeksamen i IN1000 høsten 2018

INF1000: Forelesning 7

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

YouTube-kanal ITGK. Læringsmål og pensum

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

UNIVERSITETET I OSLO

Kapittel 7: Mer om arv

Fra problem til program

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF106 Objektorientert programmering

TDT4110 Informasjonsteknologi grunnkurs: Tema: Enkle funksjoner. - 3rd edition: Kapittel Professor Alf Inge Wang

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF1000 Eksamen 2014 (modifisert)

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

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

Læringsmål og pensum. v=nkiu9yen5nc

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Læringsmål for forelesningen

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Klasser. Webprogrammering høsten Objekter. Eksempelklasser og -objekter. 2 of :56. 1 of :56

UNIVERSITETET I OSLO

INF1000 Eksamensforberedelser og -tips. Høst 2014 Siri Moe Jensen

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF1010 våren januar. Objektorientering i Java

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 1 Introduksjon til Programmering og Python. Professor Alf Inge Wang

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

IN1010 V19, Obligatorisk oppgave 2

HØGSKOLEN I SØR-TRØNDELAG

UNIVERSITETET I OSLO

Objektorientering i VB en introduksjon

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Transkript:

Læringsmål uke 7 Objektorientert programmering i Python: Introduksjon IN1000 Høst 2018 uke 7 Siri Moe Jensen Kjenne til motivasjon og bakgrunn for objektorientert programmering Kunne definere en klasse, opprette og bruke objekter Forstå sentrale begreper som grensesnitt og innkapsling Kjenne til utviklingsprosessen for en klasse gjennom design, implementasjon og testing Innhold uke 7 Lite tilbakeblikk: Programflyt og skop Lite tilbakeblikk: Prosedyrer og funksjoner Objektorientert programmering Introduksjon: Hvorfor, hva & hvordan i IN1000 Programmering med objekter Å lage en ny type objekter: Skriv en klasse! Utviklingsprosess for klasser mittprogram.py def prosedyre (p1, p2,..) : def funksjon (p1,p2,) : return def hovedprogram () : Kall på andre funk/pros Lokale variable Globale variable hovedprogram() 1

Lite tilbakeblikk: Funksjoner er uttrykk Prosedyre tar 0-n argumenter returnerer ingen verdi Funksjoner tar 0-n argumenter returnerer én verdi Lite tilbakeblikk: Funksjoner er uttrykk Funksjoner kan kombineres: Når vi trenger en verdi i et program har vi flere muligheter: er det alltid den samme? Literal/ konstant Har vi lagret verdien i en variabel? Kan vi regne den ut? Kan vi finne den ved å kalle på en funksjon? alder = int(input ("Din alder: ")) funksjonen input returnerer en verdi som brukes direkte som argument til funksjonen int. int returnerer en verdi som legges i variabelen alder. Bakgrunn Hva skjedde ~1967? Store og komplekse systemer etter ~20 år programmering med (noen av) de mekanismene dere har lært hittil. Hovedsakelig matematiske beregninger komplekse, men formelt definerte - store tallmengder, men repetitive operasjoner. Kompleksitet ga høye kostnader og feil. Arbeidsdeling og gjenbruk ble vanskelig. Samtidig: Datamaskinene ble kraftigere billigere mer utbredt => Nye anvendelser! Forsvaret? Trafikk-planlegging? Pasientjournal-systemer? Facebook?? 2

Filosofisk: Konseptet objektorientering Å programmere er å modellere Vi bygger en egen representasjon av fenomener (konkrete eller abstrakte) vi trenger å manipulere i datamaskinen denne representasjonen er ikke virkeligheten men kan holde rede på noen aspekter som er viktige for det vi skal lage et program for Vi lager en modell av "virkeligheten" Å programmere er å forstå virkeligheten det problemet/ behovet vi skal løse hva som kan/ vil endre seg i fremtiden hvilke data er viktige? Hvordan henger de sammen? hva må jeg gjøre med dem? Hvilke sammenhenger trenger jeg å ta hensyn til? hvilke ferdige programmer kan jeg bruke? skal noen bruke min kode til andre ting? Mer konkret: En måte å strukturere programmer på Prosedyrer og funksjoner kan brukes for å løse deloppgaver Hva om deloppgavene handler om å bearbeide felles, kanskje komplekse, data? Forslag: Samle relaterte data og kode for å manipulere dem i objekter Objektene tilbyr resten av programmet et sett metoder Hvordan objektet representerer og manipulerer sine data er skjult Et objekt representerer et "fenomen" vi ønsker å manipulere Vi har tidligere brukt objekter som..representerer lister m/ tilhørende metoder navneliste = [] navneliste.append("per") navneliste.append("paal") navneliste.append("espen") navn = navneliste.pop()..representerer filer m/ tilhørende metoder utfil = open ("navn.txt", "w") utfil.write (navn) utfil.close() navneliste = [] List-objekter Høyresiden oppretter et objekt en liste som foreløpig er tom og legger objektet i variabelen i venstresiden navneliste navneliste.append("per") navneliste.append("paal") navneliste.append("espen") navn = navneliste.pop() Per Paal Espen Vi kan utføre listemetoder på objektet vårt ved hjelp av kallet < variabelnavn.metodenavn(parametere) > 3

Metoder Kall på metode Vi kaller på metoder omtrent som prosedyrer og funksjoner MEN en metode alltid hører til et objekt, derfor bruker vi "dot-notasjon" minliste.append(nyttelem) uten returverdi navneliste = [] navneliste.append("per") navneliste.append("paal") med returverdi navneliste = [] navneliste.append("per") navneliste.append("paal") navn = navneliste.pop() En metode kan returnere en verdi (som funksjon) Grensesnitt Klasser Et objekt tilbyr ett sett metoder som programmerere kan bruke for å lese av, endre eller aktivisere et objekt: Objektets grensesnitt Grensesnittet bestemmes av objektets klasse Hvordan finner vi ut hvilke metoder som tilbys av objekter av en bestemt klasse? En klasse er et mønster/ oppskrift for objekter av samme type String, List og File er eksempler på innebygde Python-klasser med hver sine grensesnitt Du kan definere (programmere) dine egne klasser som du så kan opprette objekter av F eks i læreboka eller Python dokumentasjon google search: python methods List f eks https://docs.python.org/3/tutorial/datastructures.html (nb bl.a. Python versjoner) 4

Egne klasser Hvorfor lage en klasse? Eks: klasse Student med data om en student og verktøy for å arbeide med denne klasse Dato med data for dag, måned, år og verktøy for manipulasjon av disse Kan opprette ett eller mange objekter av hver klasse For å tilby et sett tjenester som hører sammen (verktøykasse) Spesielt nyttig for tjenester som trenger å dele data over tid (eks for håndtering av en liste, eller en fil, eller en tekst) For å kunne lage flere like objekter med samme data og oppførsel (eks representere studenter) Objekter av samme klasse tilbyr samme grensesnitt og har samme data men typisk med ulike verdier. For å simulere sammensatte fenomener vha objekter som representerer virkelige elementer (eks trafikk- simuleringer) Eksempel Student Skal lagre informasjon om studenter Student: Grensesnitt uformelt Ønsker å kunne gjøre følgende: Studenter har MANGE egenskaper hva skal jeg bruke klassen til? Lage et Student-objekt med gitt navn og null oppmøte Holde rede på oppmøte i gruppetimene Identifisere med navn (utvidelse) Øke oppmøte med 1 ved tilstedeværelse Lese av / hente ut oppmøte ved behov 5

Implementasjon Hvordan programmereren koder klassen "Usynlig" (privat) for programmerere som bruker klassen til å lage objekter Klassedefinisjonen bestemmer hvilke instansvariabler skal klassens objekter ha (dataene) hvordan utføres metodene (operasjonene) Hvert objekt får et eget sett instansvariabler som initialiseres ved opprettelsen Instansvariablene er private: Brukes kun av klassens metoder Hvordan lage egne klasser? class Student : def init (self) : self._antmott = 0 klassenavn def registrer(self) : self._antmott = self._antmott + 1 def hentoppmote(self) : return self._antmott funksjonsmetode konstruktør metode..og hvordan opprette et objekt? Hvert objekt får sine egne data Noen innebygde klasser har snarveier for opprettelse av objekter "" oppretter en ny str [] oppretter en ny list Ellers opprettes objekter slik: nystudent = Student() nystudent _antmott 0 Instansvariable opprettes og initialiseres i init metoden (konstruktøren) Konstruktøren kalles automatisk når et nytt objekt opprettes: oppretter objektet oppretter instansvariablene i objektet initierer objektvariablene returnerer det nye objektet til kallstedet class Student : 2) def init (self) : 3) self._antmott = 0 3) stud = Student() 1) 4) stud _antmott 4) 0 6

Student: Grensesnitt i Python Student: Implementasjon i Python Behandler en students oppmote på gruppetime class Student : Oppretter student med gitt navn og oppmote 0 def init (self, studnavn) : Registrer oppmote def registrer(self) : Hent ut oppmote def hentoppmote(self) : Antall oppmøter på gruppetime for en student class Student : Oppretter student med gitt navn og oppmøte 0 def init (self, studnavn) : self._navn = studnavn self._antmott = 0 Registrer oppmote def registrer(self) : self._antmott = self._antmott + 1 Student: Implementasjon i Python forts Studentobjekter Antall oppmøter på gruppetime for en student class Student : fortsetter fra forrige slide Hent ut oppmote def hentoppmote(self) : return self._antmott stud1 = Student("Per") stud2 = Student("Kari") stud2.registrer() print(stud1.hentoppmote()) print(stud2.hentoppmote()) _navn _antmott stud1 P e r 0 >python teststudent.py 0 1 > _navn _antmott stud2 K a r i 1 OPPGAVE (2 eller 3 sammen): - Hvilken metode mangler vi for at utskriften skal være forståelig? - Utvid klassen Student, diskuter gjerne alternativer 7

Fremgangsmåte: OOP 1. Identifiser aktuelle klasser (hva er sentrale «ting»/ begreper programmet skal behandle?) 2. Design klassens grensesnitt (hvilke operasjoner trenger jeg for objekter av klassen?) 3. Design klassens datarepresentasjon (hvordan skal objektene representere dataene sine?) 4. Implementer (fyll ut) metodene (skriv klassen ferdig) 5. Lag et testprogram som oppretter et eller flere objekter og kaller på metodene i objektenes grensesnitt Test av klassen Vi bruker Pythons (interaktive) shell eller skriver et testprogram i en egen fil Importerer klassen Student Oppretter (minst) et objekt Kaller på alle metoder (minst) en gang - ulike sekvenser kan være nødvendig for å avdekke feil siden objekter husker verdiene sine (har en tilstand) assert tvinger oss til å tenke ut på forhånd hva vi forventer Innkapsling Alle endringer av et objekts instansvariable skal skje ved hjelp av klassens metoder (grensesnitt/ public interface) Eksempel II: Utgiftsregnskap Hvor mye penger har jeg brukt (f eks ila en dag på reise, varer i handlevognen, eller en kveld ute) Metodene inne i klassen kan endre og lese av variabelen _antmott mens kode utenfor klassen må kalle en metode på et objekt for å lese den av eller endre den i objektet. Innkapsling er et sentralt oo prinsipp kode kan endres så lenge grensesnittet er det samme gjennomført ansvarsdeling (splitt og hersk) Registrerer fortløpende Leser av ved behov Vi skal programmere en klasse som hjelper oss med dette 8

Utgifter: Uformelt grensesnitt Klassen Utgifter holder rede på det vi bruker Hvilke operasjoner skal tilbys? Registrer en ny utgift, dvs øke summen av hittil registrerte beløp Lese av summen av hittil registrerte beløp Dette beskriver grensesnittet for Utgifter-klassen med ord Utgifter: Grensesnitt i Python En metode for hver operasjon Legger til en ny utgift def leggtil(self, utgift) : returnerer totalbelop brukt hittil def brukt(self) : Dette er klassen grensesnitt uttrykt i Python Et komplett grensesnitt skal senere inkludere standardisert dokumentasjon av hver metode Oppgave: Implementer klassen Utgifter med dette grensesnittet Utgifter: Implementasjon class Utgifter : trenger en belop-variabel, initialiserer med 0 def init (self) : self._belop = 0.0 metode som legger til en ny utgift def leggtil(self, utgift) : self._belop = self._belop + utgift returnerer totalbelop brukt hittil def brukt(self) : return self._belop Program med prosedyrer og funksjoner mittprogram.py def prosedyre (p1, p2,..) : def funksjon (p1,p2,) : return def hovedprogram () : Kall på andre funk/pros hovedprogram() 9

mittklasseprogram.py Program med klasser class Klasse1 : def init (self,p1,) : self._instvar = def metode1 (self, p2,..) : def hovedprogram () : oppretter og bruker objekter Oppsummering uke 7 Flere perspektiver på objektorientert programmering: - kodeperspektiv; en måte å strukturere programmene på/ arkitektur - historisk/ utviklingsperspektiv; støtter (sikker) implementasjon av større systemer i takt med teknologiutviklingen - modellperspektiv; hvordan beskrive, forstå og dele mer komplekse fenomener mellom flere interessenter Utviklingsprosess for et objektorientert program: Klasse(r) - grensesnittet - innhold - teste Grensesnitt: Et sett dokumenterte metoder som tilbys av en klasse Innkapsling: Skjule implementasjon av klassen for de som bruker den hovedprogram() 10