IN1000 - Seminartime uke 7¶
Om du ikke allerede har gjort det se (utenom gruppetimen)¶
Stikkord for timen¶
- Objektorientering
- Klasser
- Konstrukt?rer
- Innkapsling
Objektorientert programmering¶
- Handler om ? "modellere" verden
- Lage modeller der vi f?r med egenskaper ved ett objekt.
- En klasse beskriver et sett med objekter med samme oppf?rsel
Personklassen¶
Her har vi en modell av en person.
Det vil si de egenskapene hos en person vi er interessert i ved dette programmet (en person har flere egenskaper i tillegg, men vi programmerer kun de vi er interessert i/har bruk for ? lagre).
Alle egenskapene vi har lagt til i person er noe som er felles for alle personer!
Forel?pig er dette kun en mal og ikke en person i seg selv.
Vi lager instanser av Person-klassen¶
N?r vi lager en person, lager vi en instans av klassen Person.
B?de magnus og nicolai er ulike objekter/ulike instanser av et objekt av samme klasse.
Men vi er ikke bare opptatt av egenskaper, ogs? hvilke handlinger objektene kan gj?re.
Vi kan bestemme hvilke handlinger et objekt skal ha¶
- Alle klasser har et public (tilgjengelig utenfra) interface, et grensesnitt, alts? hvilke metoder du kan bruke og hva metodene gj?r.
Eksempel¶
Du har et objekt “bil”, den har en metode som heter “kjor(km)”. Vi vet ikke helt hvordan den er definert, vi vet bare at den tar bilen p? en kj?retur i oppgitt antall km, og kanskje da oppdaterer tanken og kilometerstanden (fordi den har kj?rt).
Vi vet ikke hvordan det gj?res, vi bare vet at det skjer n?r vi kaller metoden, dette kalles innkapsling.
Analogi:¶
- Man kan kj?re en bil ved hjelp av rattet og pedalene uten ? vite hvordan motoren fungerer.
- Slik er det ogs? med objekter. Vi skal kunne bruke metoder uten ? vite hvordan de er implementert.
Lage en enkel klasse¶
Person med navn. Filen heter person.py
Her er en liten start
class Person :
def settNavn(self, navn) :
self._navn = navn
def skrivNavn(self) :
print("Jeg heter", self._navn)
Oppgave 1¶
Ut fra tegningen lagd av personene ovenfor lag en klasse person. Som har metodene:
settNavn(self, navn)
-> setter navnet p? personen
skrivNavn(self)
-> skriver ut navnet ? personen p? dette formatet!Jeg heter <navn>"
settAlder(self, alder)
-> setter aldren p? personen
settVekt(self, vekt)
-> setter vekten p? personen
settHoyde(self, hoyde)
-> setter vekten p? personen
skrivUtInfo(self)
-> som skriver ut infoen om personen
skrivUtHilsen(self)
-> som skriver ut en hilsen fra personen, p? formen"Hei, jeg *heter <navn> og jeg er <alder> aar gammel"
hoyereEnn(self, annenPerson)
-> tar inn en annen person og returnere True hvis personen er h?yere enn den andre personen, False ellers
Bruke klassen vår¶
For ? f? brukt klassen v?r m? vi i v?r hovedfil (ikke Person-klassen, men feks. test.py) laste inn Person-klassen:
from person import Person
Syntaksen p? dette er from <module> import <Klasse>
. Alts?, from filnavnet import Klasse.
Man kan skrive en klasse inn i hvilken som helst fil, men i dette kurset ?nsker vi én fil per klasse!!
Har vi filen bil.py og definerer den ?verst som class Broom_bil
skriver vi
from bil import Broom_bil
Vi oppretter en instans av et objekt, variabelnavnet er emilie:
person1 = Person()
Vi kaller p? metodene
person1.settNavn("Emilie")
person1.skrivNavn()
Syntaks for klasser¶
class Klassenavn :
def metodeNavn(parameter1, parameter2, ...)
# som funksjoner/ prosedyrer, men
# alltid self som f?rste parameter!
...
...
Konstruktører¶
Bestemmer hva som m? v?re med ved opprettelsen av ett objekt.
I forrige eksempel var det litt rart ? lage en person uten navn - kan jo kalle “settNavn”-metoden hver gang, men mye bedre ? bestemme at navn M? oppgis n?r objektet opprettes.
Bruker da navn som parameter til konstrukt?ren:
Syntaks:¶
class Klasse : (#f? med to understreker _ _!)
def __init__(self, parameter1, parameter2, ...) :
self._verdi = parameter1
self._verdi2 = parameter2
...
Eks:
class Person :
def __init__(self, navn) :
self._navn = navn
I opprettelsen av objektet:
person1 = Person("Emilie")
eller
person1_navn = "Emilie"
person1 = Person(person1_navn)
Oppgave 2¶
Endre oppgave 1 slik at den n? i stedet for ? ha metodene settNavn
, settAlder
, settVekt
og setHoyde
tar dette inn og setter disse (instans)variablene i konstrukt?ren istedenfor?
Hvilke fordeler/ulemper har dette? Diskuter
Oppgave 3¶
Gitt klassen person som dere har laget over, opprett 3 instanser av klassen/objekter med navn/alder/vekt/hoyde du velger selv. Skriv deretter ut en hilsen fra hver person deres ved hjelp av skrivUtHilsen-metoden. Lagre deretter alle objektene i en liste.
Utfordring: se om du kan kalle p? “skrivUtHilsen()”-metoden i en for-l?kke
Utfordring: lag en funksjon som tar inn en liste med personer, og returnerer den personen som er h?yest
Oppgave 4¶
Skriv en klasse Dyr. Et dyr har f?lgende egenskaper:
- Art
- Kj?nn
- Vekt
Lag en konstrukt?r (init-metode) og metoder for ? hente ut data fra hver instansvariabel.
Opprett tre objekter av klassen Dyr for ? representere tre forskjellige dyr. Skriv ut informasjon om alle dyrene.