Programmering nivå 2

Kap 3.1 – Vad är OOP?

Förstå hur objekt, klasser, attribut och metoder används för att strukturera program.

Mål med lektionen

När du har arbetat klart med denna lektion ska du:

  • Känna till grunderna i objektorienterad programmering (OOP).
  • Förstå varför OOP används och vad det innebär att tänka i objekt.
  • Kunna skilja mellan begreppen klass, objekt, konstruktor, attribut och metod.

Så här lär du dig bäst

Börja med att läsa igenom hela lektionen för att få en helhetsbild. Försök tänka på hur du skulle beskriva verkliga företeelser med kod: en bil, en bok eller en elev. Jämför gärna hur samma problem skulle kunna lösas med fristående funktioner respektive med objekt.

Centrala begrepp

  • Klass: en mall eller ritning för att skapa objekt, till exempel typen Bok.
  • Objekt: ett självständigt paket av data och funktionalitet, till exempel en specifik bok.
  • Metod: en funktion som hör till en klass eller ett objekt, till exempel skriv_ut_info().
  • Konstruktor: den metod som körs när ett nytt objekt skapas. I Python heter den __init__().
  • Egenskap eller attribut: data som hör till ett objekt, till exempel en boks titel eller författare.
  • Funktion: en fristående koddel som kan anropas med sitt namn, till exempel print() eller berakna_summa().
  • Inkapsling: att dölja interna detaljer i ett objekt och exponera en tydlig yta.
  • Återanvändning: att skapa kod som kan användas flera gånger genom att skapa nya objekt.

Klass och objekt: Klassen kan du se direkt i koden. Den beskriver hur objekt ska skapas och fungera. Ett objekt skapas först när programmet körs och koden anropar klassen, till exempel bok = Bok(...).

Dessa begrepp är viktiga eftersom de bygger upp strukturen i objektorienterad programmering. När du skriver program i Python kommer du att använda dem ofta.

Vad är objektorienterad programmering?

Objektorienterad programmering är ett sätt att skriva program där man utgår från objekt. Ett objekt innehåller både data, till exempel ett namn, och funktioner, till exempel en metod som skriver ut information om objektet.

I traditionell programmering skriver du ofta kod i fristående funktioner. I OOP organiseras programmet runt klasser som beskriver hur objekt ska fungera. En klass är som en ritning. När programmet körs skapas riktiga objekt, alltså instanser av klassen.

Funktion, metod och konstruktor

En funktion är en koddel som står fritt och anropas med sitt namn. En metod är också en funktion, men den ligger inuti en klass och hör till objekt som skapas från klassen.

# Funktion
def skriv_hej():
    print("Hej")

class Bok:
    # Metod
    def skriv_ut_info(self):
        print("Information om boken")

I exemplet är skriv_hej() en vanlig funktion. skriv_ut_info() är en metod eftersom den ligger i klassen Bok. Metoder har ofta parametern self, som betyder "det här objektet".

En konstruktor används för att ge ett nytt objekt startvärden. I Python skrivs konstruktorn som __init__(). Den körs automatiskt när du skapar ett objekt, till exempel med bok1 = Bok("Project Hail Mary", "Andy Weir").

Exempel: böcker

Föreställ dig att du vill skapa ett program som hanterar böcker. Med OOP kan du skapa en klass Bok med egenskaper som titel och författare, och metoder som skriver ut information.

class Bok:
    def __init__(self, titel, forfattare):
        self.titel = titel
        self.forfattare = forfattare

    def skriv_ut_info(self):
        print(f"{self.titel} av {self.forfattare}")

bok1 = Bok("Project Hail Mary", "Andy Weir")
bok2 = Bok("Surely You're Joking, Mr. Feynman!", "Richard P. Feynman")

bok1.skriv_ut_info()
bok2.skriv_ut_info()

I exemplet är Bok klassen. Raden def __init__(self, titel, forfattare): är konstruktorn. Den tar emot startvärden när ett objekt skapas. Raderna self.titel = titel och self.forfattare = forfattare sparar värdena i det objekt som skapas. När koden kör bok1.skriv_ut_info() anropas metoden på just objektet bok1.

Repetition från kap 1.3: titel och forfattare är parametrar eftersom de står i metodens definition. När programmet kör Bok("Project Hail Mary", "Andy Weir") är "Project Hail Mary" och "Andy Weir" argument eftersom de skickas in till konstruktorn. self är också en parameter, men Python skickar in objektet själv automatiskt när metoden anropas.

Interaktiv övning: skapa bokobjekt

Testa hur klassen Bok används som mall. Varje gång du skapar en bok får objektet egna värden i attributen titel och forfattare. När du kör metoden skriv_ut_info() används objektets egna attribut.

Prova till exempel att:

  • skapa bok1 och kör metoden
  • ändra titel och författare och skapa bok2
  • jämföra hur objekten sparar olika attribut
Inga bokobjekt är skapade än. Välj bok1 eller bok2 och tryck på Skapa objekt.

Programmering 2-koppling: klassen är mallen, men varje objekt har egna attributvärden. Samma metod kan därför ge olika utskrift för olika objekt.

OOP är särskilt användbart när du bygger större program. Det gör koden mer strukturerad, lättare att felsöka och enklare att återanvända.

Öva själv

Övning 1: Skapa klassen Hund

Skapa klassen Hund. Konstruktorn ska ta emot hundens namn och ras och spara dem i attributen namn och ras. Skapa ett objekt och skriv ut attributen.

Kontrollera programmet

  • Klassen ska ha en konstruktor som heter __init__().
  • Attributen ska sparas med self.
  • Hundens namn och ras ska skrivas ut.

Fundera: Vad är klassen och vad är objektet i ditt program?

När du har försökt själv: visa lösningsförslaget till övning 1 på GitHub.

Övning 2: Flera bokobjekt

Skapa klassen Bok med attributen titel och forfattare. Lägg till metoden skriv_ut_info(), som skriver ut båda attributen. Skapa tre olika bokobjekt och anropa metoden på varje objekt.

Kontrollera programmet

  • Alla tre objekten ska vara skapade från samma klass.
  • Varje objekt ska ha egna värden.
  • Samma metod ska ge olika utskrift beroende på vilket objekt som används.

Fundera: Varför behöver du inte skriva tre olika metoder för de tre böckerna?

När du har försökt själv: visa lösningsförslaget till övning 2 på GitHub.

Övning 3: Ändra ett attribut med en metod

Skapa klassen Spelare med attributen namn och poang. Lägg till metoden lagg_till_poang(antal), som ökar spelarens poäng, och metoden skriv_ut_info(). Skapa en spelare, lägg till poäng två gånger och skriv ut resultatet.

Testa programmet genom att

  • starta spelaren på 0 poäng.
  • lägga till två olika poängtal.
  • kontrollera att den slutliga poängen är summan av båda talen.

Fundera: Varför måste metoden använda self.poang när värdet ska ändras?

När du har försökt själv: visa lösningsförslaget till övning 3 på GitHub.

Övning 4: Konto med insättning

Skapa klassen Konto med attributen agare och saldo. Lägg till metoden satt_in(belopp). Metoden ska bara öka saldot om beloppet är större än 0; annars ska den skriva ut ett felmeddelande. Lägg också till en metod som visar kontots uppgifter.

Testa programmet med

  • en giltig insättning.
  • beloppet 0.
  • ett negativt belopp.

Fundera: Vilken del av klassen är data och vilken del är funktionalitet?

När du har försökt själv: visa lösningsförslaget till övning 4 på GitHub.

Övning 5: Elever i en lista

Svårare övning: Här kombinerar du klasser och objekt med en lista, en funktion och en loop.

Skapa klassen Elev med attributen namn, klassnamn och alder. Klassen ska ha metoden skriv_ut_info(). Skapa minst tre elevobjekt, lägg dem i en lista och skriv funktionen skriv_ut_elever(elever), som går igenom listan och anropar varje objekts metod.

Kontrollera programmet

  • Listans element ska vara objekt av klassen Elev.
  • Funktionen ska fungera även när du lägger till ytterligare ett elevobjekt.
  • Testa också funktionen med en tom lista.

Fundera: Vad innehåller loopvariabeln under varje varv i loopen?

När du har försökt själv: visa lösningsförslaget till övning 5 på GitHub.

Övning 6: Meny för produkter

Svårare övning: Här kombinerar du en klass med objekt, lista, funktioner, meny, loopar och säker inmatning.

Skapa klassen Produkt med attributen namn och pris samt metoden skriv_ut_info(). Bygg sedan ett menyprogram med alternativen 1. Lägg till produkt, 2. Visa alla produkter och 3. Avsluta. Nya produktobjekt ska sparas i en lista. Priset ska omvandlas till ett decimaltal och felaktig inmatning ska hanteras med try och except ValueError.

Testa programmet genom att

  • visa listan innan någon produkt har lagts till.
  • lägga till minst tre produkter med olika priser.
  • skriva text i stället för ett pris.
  • göra ett ogiltigt menyval och därefter avsluta.

Fundera: När skapas ett nytt objekt och när används ett objekt som redan finns?

När du har försökt själv: visa lösningsförslaget till övning 6 på GitHub.

Sammanfattning

  • Objektorienterad programmering handlar om att organisera koden runt objekt.
  • En klass är en ritning och ett objekt är en instans av klassen.
  • En konstruktor, __init__(), ger objektet startvärden när det skapas.
  • En metod liknar en funktion, men hör till en klass eller ett objekt.
  • OOP gör det enklare att bygga stora program genom att separera logik och data.
  • Centrala begrepp är klass, objekt, konstruktor, attribut, metod och inkapsling.

Tillbaka till Kapitel 3