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()ellerberakna_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
bok1och kör metoden - ändra titel och författare och skapa
bok2 - jämföra hur objekten sparar olika attribut
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å
0poä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.