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.