Programmering nivå 2

Kap 3.2 – Skapa klasser och objekt

Definiera egna klasser och skapa objekt som har egna attribut och metoder.

Mål med lektionen

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

  • Kunna definiera egna klasser i Python.
  • Förstå hur man skapar och använder objekt från en klass.
  • Kunna använda konstruktorer och skapa metoder i en klass.

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

Börja med att läsa exemplen och försök förstå hur varje del fungerar. Kopiera koden och kör den själv. Gör sedan små ändringar och se vad som händer. Tänk på hur du kan använda egna klasser för att beskriva verkliga företeelser.

Centrala begrepp

Kap 3.1 förklarade begreppen. Här använder du dem praktiskt när du skriver egna klasser.

  • Klass: en mall som beskriver hur ett objekt ska fungera.
  • Objekt: en instans av en klass som skapas när programmet körs.
  • __init__(): klassens konstruktor, som körs när objektet skapas.
  • self: referens till det aktuella objektet inom klassen.
  • Metod: en funktion som tillhör en klass och använder self.

Du behöver förstå dessa begrepp för att kunna bygga program med flera objekt som samarbetar. De är grunden för det objektorienterade arbetssättet.

Arbetsgång: från idé till klass

När du skapar en egen klass kan du följa samma ordning nästan varje gång:

  1. Bestäm vad klassen ska representera, till exempel Book eller Person.
  2. Bestäm vilka attribut varje objekt behöver ha.
  3. Skriv konstruktorn __init__() och spara attributen med self.
  4. Lägg till metoder som beskriver vad objektet kan göra.
  5. Skapa ett eller flera objekt och testa metoderna.

Skapa och använda klasser

I Python definierar du en klass med nyckelordet class. Här är ett enkelt exempel på en klass som representerar en bok:

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def print_info(self):
        print(f"{self.title} av {self.author}")

Här definieras två attribut, title och author, samt en metod print_info(). För att använda klassen skapar du ett objekt:

book1 = Book("1984", "George Orwell")
book1.print_info()

Detta skapar ett nytt objekt, book1, av typen Book. När du anropar metoden print_info() använder objektet sina egna attribut.

Flera objekt från samma klass

En viktig poäng med klasser är att samma klass kan skapa flera objekt. Objekten har samma struktur, men egna värden.

book1 = Book("1984", "George Orwell")
book2 = Book("The Martian", "Andy Weir")

book1.print_info()
book2.print_info()

Båda objekten är skapade från klassen Book, men book1 och book2 har olika värden i title och author.

Ändra ett attribut

Efter att ett objekt har skapats kan du ändra ett attribut med punktnotation.

book1.title = "Animal Farm"
book1.print_info()

Det här ändrar bara book1. Andra objekt som skapats från samma klass påverkas inte.

Öva: skapa en egen klass

Skriv en klass som heter Person. Den ska ha attributen name och age, och en metod som skriver ut:

Hej, jag heter [namn] och är [ålder] år.

Tips:

  • Börja med att skriva class Person:
  • Lägg till en __init__-metod med self, name och age.
  • Lägg till en metod say_hello() som skriver ut informationen.
  • Skapa två olika objekt, till exempel person1 och person2.
  • Testa att ändra åldern på ett av objekten efter att det skapats.

Interaktiv övning: skapa ett Person-objekt

Fyll i namn och ålder. Tryck först på Skapa objekt för att simulera person1 = Person(name, age). Kör sedan metoden say_hello().

Inget Person-objekt är skapat än.

Programmering 2-koppling: __init__ sparar värdena i objektet, och metoden använder sedan self.name och self.age för utskriften.

Öva själv

Övning 1: Skapa en person

Skapa klassen Person med attributen name och age. Lägg till metoden say_hello(), som presenterar personen. Skapa ett objekt och anropa metoden.

Kontrollera programmet

  • Konstruktorn ska ta emot namn och ålder.
  • Värdena ska sparas som attribut med self.
  • Metoden ska använda objektets egna attribut.

Fundera: När körs __init__()?

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

Övning 2: Två oberoende spelkaraktärer

Skapa klassen Spelkaraktar med attributen namn och liv samt metoden visa_status(). Skapa två objekt med olika värden. Ändra sedan liv direkt med punktnotation på det ena objektet och visa båda objektens status igen.

Kontrollera programmet

  • Båda objekten ska skapas från samma klass.
  • Endast det valda objektets liv ska ändras.
  • Metoden ska fungera på båda objekten.

Fundera: Varför påverkas inte det andra objektet när det första ändras?

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

Övning 3: Bilens mätarställning

Skapa klassen Bil med attributen modell och kilometer. Lägg till metoden kor(stracka), som ökar bilens mätarställning med den angivna sträckan, och metoden visa_info(). Kör bilen två sträckor och visa resultatet.

Testa programmet genom att

  • skapa en bil med en mätarställning större än 0.
  • anropa kor() med två olika sträckor.
  • kontrollera att båda sträckorna har lagts till.

Fundera: Vad är parameter och vad är argument när kor() används?

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

Övning 4: Bok med utlåningsstatus

Skapa klassen Book med attributen title, author och is_borrowed. När ett objekt skapas ska is_borrowed vara False. Lägg till metoderna borrow(), som ändrar värdet till True, och print_info(), som skriver ut bokens uppgifter och status.

Kontrollera programmet

  • Skapa två böcker och låna bara den ena.
  • Den lånade boken ska visa att den är utlånad.
  • Den andra bokens status ska fortfarande vara ledig.

Fundera: Varför behöver is_borrowed inte vara en parameter i konstruktorn?

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

Övning 5: Sök bland kontaktobjekt

Svårare övning: Här kombinerar du klasser och objekt med en lista, funktioner och linjär sökning.

Skapa klassen Kontakt med attributen namn och telefon samt metoden visa_info(). Skapa minst fyra kontaktobjekt och lägg dem i en lista. Skriv funktionen hitta_kontakt(kontakter, soknamn), som returnerar objektet med rätt namn. Om kontakten saknas ska funktionen returnera None.

Testa funktionen med

  • namnet på den första kontakten.
  • namnet på den sista kontakten.
  • ett namn som inte finns.

Fundera: Vad returneras: kontaktens namn eller hela kontaktobjektet?

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

Övning 6: Varukorg med objekt

Svårare övning: Här kombinerar du klasser och flera objekt med lista, funktioner, loopar och beräkningar.

Skapa klassen Vara med attributen namn, pris och antal. Lägg till metoden berakna_summa(), som returnerar varans pris multiplicerat med antalet, och metoden visa_info(). Skapa minst tre varuobjekt och lägg dem i en lista. Skriv funktionen berakna_total(varukorg), som returnerar hela varukorgens kostnad.

Kontrollera programmet

  • Varje vara ska kunna beräkna sin egen summa.
  • Alla varor och deras summor ska skrivas ut.
  • Totalen ska ändras om du ändrar antalet på ett av objekten.
  • En tom varukorg ska ge totalen 0.

Fundera: Vilken beräkning hör till objektet och vilken beräkning behöver hela listan?

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

Sammanfattning

  • En klass i Python skapas med class och innehåller metoder och attribut.
  • __init__ används för att sätta upp objektets startvärden.
  • self används för att referera till objektet självt.
  • Du skapar ett objekt genom att anropa klassen som en funktion.
  • Samma klass kan skapa flera objekt med olika attributvärden.

Tillbaka till Kapitel 3