Tilbake
1.2
Klasser og objekter

1.2 Klasser og objekter

Definere klasser, opprette objekter og bruke metoder.

65 min
7 oppgaver
KlasserObjekterMetoderAttributter
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 7 oppgaver

Klasser og objekter

Nå er det tid for å gå fra teori til praksis! I dette kapittelet skal du lære å definere dine egne klasser i Python, og forstå hvordan klasser og objekter henger sammen.

Tenk på en klasse som en oppskrift eller en mal. Hvis klassen er oppskriften på en kake, er objektet den ferdige kaken. Du kan bake mange kaker fra samme oppskrift – hver kake er et unikt objekt, men alle følger samme mal.

Klasse vs. objekt

- Klasse: En mal eller blueprint som definerer hvilke attributter (data) og metoder (funksjoner) objekter av denne typen skal ha
- Objekt: En konkret instans av en klasse, med sine egne verdier for attributtene
- Instans: Et annet ord for objekt – vi sier at vi "instansierer" en klasse når vi lager et objekt av den

✏️Din første klasse

La oss lage en enkel klasse som representerer en person:

class Person:
    def __init__(self, navn, alder):
        self.navn = navn
        self.alder = alder

    def hilse(self):
        print(f"Hei, jeg heter {self.navn} og er {self.alder} år gammel.")

# Lag objekter (instanser) av Person-klassen
person1 = Person("Kari", 25)
person2 = Person("Ola", 30)

# Bruk objektene
person1.hilse()  # Hei, jeg heter Kari og er 25 år gammel.
person2.hilse()  # Hei, jeg heter Ola og er 30 år gammel.

# Aksesser attributter
print(person1.navn)   # Kari
print(person2.alder)  # 30

Hva skjer her?
1. Vi definerer en klasse med class Person:
2. Vi lager en konstruktør (__init__) som kjører når objektet opprettes
3. Vi lagrer attributter (navn og alder) på objektet med self.navn osv.
4. Vi definerer en metode (hilse) som objektet kan bruke
5. Vi instansierer klassen to ganger for å lage to forskjellige Person-objekter

Konstruktøren __init__
Konstruktøren er en spesiell metode som kjører automatisk når du lager et nytt objekt. I Python heter den alltid __init__.

Syntaks:

def __init__(self, parameter1, parameter2, ...):
    self.attributt1 = parameter1
    self.attributt2 = parameter2
    # ... annen oppsettskode

Konstruktøren brukes til:
- Sette startverdi for attributter
- Initialisere objektet
- Kjøre nødvendig oppsettskode

Hva er self?

Det mystiske self dukker opp overalt i Python-klasser. Hva betyr det egentlig?

self refererer til objektet selv – det objektet som metoden kalles på. Når du skriver person1.hilse(), er self inni hilse()-metoden lik person1.

Tenk på det slik: Når du sier "Jeg går til butikken", refererer "jeg" til deg selv. På samme måte refererer self til objektet som "snakker".

Hvorfor må vi skrive self?
Python krever at du eksplisitt sender med objektreferansen som første parameter i metoder. Dette gjør det tydelig at metoden jobber med objektets egne data. Noen språk (som Java) har this i stedet, som fungerer automatisk.

✏️Attributter med standardverdier

Du kan gi attributter standardverdier i konstruktøren. Dette gjør det valgfritt å sende inn verdien:

class Bankkonto:
    def __init__(self, kontonummer, eier, saldo=0):
        self.kontonummer = kontonummer
        self.eier = eier
        self.saldo = saldo

    def vis_info(self):
        print(f"Konto: {self.kontonummer}")
        print(f"Eier: {self.eier}")
        print(f"Saldo: {self.saldo} kr")

# Lag konto uten å oppgi saldo (bruker standard 0)
konto1 = Bankkonto("12345678", "Kari Nordmann")
konto1.vis_info()
# Konto: 12345678
# Eier: Kari Nordmann
# Saldo: 0 kr

# Lag konto med startsaldo
konto2 = Bankkonto("87654321", "Ola Nordmann", 5000)
konto2.vis_info()
# Konto: 87654321
# Eier: Ola Nordmann
# Saldo: 5000 kr

Parameteren saldo=0 betyr at hvis brukeren ikke oppgir en saldo, settes den automatisk til 0.

Metoder som endrer objektet

Metoder kan ikke bare lese attributter – de kan også endre dem. Dette er en av de store fordelene med OOP: Objektet holder styr på sin egen tilstand.

La oss utvide Bankkonto-eksemplet:

class Bankkonto:
    def __init__(self, kontonummer, eier, saldo=0):
        self.kontonummer = kontonummer
        self.eier = eier
        self.saldo = saldo

    def sett_inn(self, belop):
        if belop > 0:
            self.saldo += belop
            print(f"Satt inn {belop} kr. Ny saldo: {self.saldo} kr")
        else:
            print("Beløpet må være positivt")

    def ta_ut(self, belop):
        if belop > self.saldo:
            print("Ikke nok penger på konto")
        elif belop <= 0:
            print("Beløpet må være positivt")
        else:
            self.saldo -= belop
            print(f"Tok ut {belop} kr. Ny saldo: {self.saldo} kr")

# Bruk
konto = Bankkonto("12345678", "Kari Nordmann", 1000)
konto.sett_inn(500)    # Satt inn 500 kr. Ny saldo: 1500 kr
konto.ta_ut(200)       # Tok ut 200 kr. Ny saldo: 1300 kr
konto.ta_ut(2000)      # Ikke nok penger på konto

Legg merke til hvordan metodene endrer self.saldo og også validerer input. Dette er fornuftig logikk som hører hjemme i Bankkonto-klassen.

Flere objekter av samme klasse

En av styrkene ved klasser er at du kan lage mange objekter fra samme mal. Hvert objekt har sine egne attributtverdier og er uavhengig av de andre:

class Hund:
    def __init__(self, navn, rase, alder):
        self.navn = navn
        self.rase = rase
        self.alder = alder

    def bjeff(self):
        print(f"{self.navn}: Voff voff!")

    def beskriv(self):
        print(f"{self.navn} er en {self.alder} år gammel {self.rase}")

# Lag flere hunder
hund1 = Hund("Fido", "Golden Retriever", 3)
hund2 = Hund("Max", "Labrador", 5)
hund3 = Hund("Bella", "Schæfer", 2)

# Hver hund er et selvstendig objekt
hund1.beskriv()  # Fido er en 3 år gammel Golden Retriever
hund2.beskriv()  # Max er en 5 år gammel Labrador
hund3.bjeff()    # Bella: Voff voff!

# Endre én hunds attributt påvirker ikke de andre
hund1.alder = 4
print(hund1.alder)  # 4
print(hund2.alder)  # 5 (uendret)

Selv om alle tre objektene er Hund-objekter, har de hver sin navn, rase og alder.

Metoder som returnerer verdier

Ikke alle metoder skriver bare ut noe eller endrer objektet. Mange metoder returnerer en verdi, akkurat som vanlige funksjoner:

class Rektangel:
    def __init__(self, lengde, bredde):
        self.lengde = lengde
        self.bredde = bredde

    def areal(self):
        return self.lengde * self.bredde

    def omkrets(self):
        return 2 * (self.lengde + self.bredde)

    def er_kvadrat(self):
        return self.lengde == self.bredde

# Bruk
rekt = Rektangel(5, 3)
print(f"Areal: {rekt.areal()} cm²")      # Areal: 15 cm²
print(f"Omkrets: {rekt.omkrets()} cm")   # Omkrets: 16 cm
print(f"Kvadrat: {rekt.er_kvadrat()}")   # Kvadrat: False

kvadrat = Rektangel(4, 4)
print(f"Kvadrat: {kvadrat.er_kvadrat()}")  # Kvadrat: True

Metodene areal(), omkrets() og er_kvadrat() regner ut noe basert på objektets attributter og returnerer resultatet.

Klasser med sammensatte data

Attributter i en klasse kan være hvilken som helst datatype – inkludert lister, ordbøker, eller til og med andre objekter!

class Handlekurv:
    def __init__(self):
        self.varer = []  # Tom liste

    def legg_til(self, vare, pris):
        self.varer.append({"vare": vare, "pris": pris})
        print(f"La til {vare} i handlekurven")

    def total_pris(self):
        return sum(vare["pris"] for vare in self.varer)

    def vis_innhold(self):
        print("Handlekurv:")
        for vare in self.varer:
            print(f"  - {vare['vare']}: {vare['pris']} kr")
        print(f"Totalt: {self.total_pris()} kr")

# Bruk
kurv = Handlekurv()
kurv.legg_til("Melk", 20)
kurv.legg_til("Brød", 35)
kurv.legg_til("Ost", 80)
kurv.vis_innhold()
# Handlekurv:
#   - Melk: 20 kr
#   - Brød: 35 kr
#   - Ost: 80 kr
# Totalt: 135 kr

Her bruker vi en liste (self.varer) for å lagre ordbøker med vareinformasjon. Dette viser hvordan OOP kan håndtere kompleks data på en ryddig måte.

Oppsummering

I dette kapittelet har du lært:

- Klasse vs. objekt: mal mot konkret instans.
- Konstruktør (_init): kjører når et objekt lages.
- self: refererer til selve objektet.
- Attributter og metoder: data og funksjoner i objektet.
- Flere objekter: hvert objekt er selvstendig.

Noekkelbegreper


BegrepForklaring
KlasseMal/blueprint for objekter
ObjektKonkret instans av en klasse
init_Konstruktør som kjører ved objektoppretting
selfReferanse til selve objektet

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.