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).

Personklasse.png

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.

flerepersoner.png

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.