Programmering nivå 2

Kap 3.3 – Metoder som ändrar objekt

Använd metoder för att läsa, ändra och kontrollera objektets data.

Mål med lektionen

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

  • Kunna skriva metoder som läser objektets attribut.
  • Kunna skriva metoder som ändrar objektets attribut.
  • Förstå varför metoder kan vara bättre än att ändra attribut direkt.

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

Kör exemplen och följ hur objektets värden förändras. Titta särskilt på skillnaden mellan en metod som bara skriver ut information och en metod som faktiskt ändrar ett attribut.

Centrala begrepp

Du har redan mött klass, objekt, konstruktor och self. I det här kapitlet använder du dem för att skapa metoder som styr hur objekt får ändras.

  • Läsande metod: en metod som visar eller returnerar data utan att ändra objektet.
  • Ändrande metod: en metod som ändrar ett eller flera attribut i objektet.
  • Validering: att kontrollera att ett nytt värde är rimligt innan objektet ändras.
  • Instansvariabel: ett attribut som är unikt för varje objekt, till exempel self.year.

Kort repetition

__init__() ger objektet startvärden när objektet skapas. self betyder "det här objektet". Nu ska metoderna få mer ansvar än att bara skriva ut text.

Metoder som läser data

En läsande metod använder objektets attribut utan att ändra dem.

class Car:
    def __init__(self, brand, year):
        self.brand = brand
        self.year = year

    def honk(self):
        print(f"{self.brand} från {self.year} tutar!")

När du skapar ett objekt använder du klassen som en funktion:

car1 = Car("Volvo", 2020)
car1.honk()

Skapa sedan ett eget objekt, car2, med en egen bil och årsmodell. Då tränar du på att samma klass kan skapa flera objekt med olika värden.

car2 = Car("Toyota", 2018)
car2.honk()

I detta exempel:

  • brand och year sparas som attribut i objektet.
  • honk() läser attributen och skriver ut ett meddelande.
  • honk() ändrar inte bilen.

Metoder som ändrar data

En ändrande metod uppdaterar objektets attribut. Det gör att objektet får ett nytt tillstånd.

class Car:
    def __init__(self, brand, year):
        self.brand = brand
        self.year = year

    def honk(self):
        print(f"{self.brand} från {self.year} tutar!")

    def change_year(self, new_year):
        self.year = new_year

car1 = Car("Volvo", 2020)
car1.change_year(2023)
car1.honk()

new_year är en parameter. När koden kör car1.change_year(2023) är 2023 argumentet. Metoden sparar argumentet i self.year.

Varför använda en metod för att ändra?

Du kan ändra ett attribut direkt:

car1.year = 2023

Men en metod är bättre när du vill kontrollera värdet innan objektet ändras.

def change_year(self, new_year):
    if new_year > 0:
        self.year = new_year
    else:
        print("Årtalet måste vara större än 0.")

Nu skyddar metoden objektet från ett orimligt årtal.

Interaktiv övning: ändra objekt med metod

Skapa ett Car-objekt, kör honk() och ändra sedan årtalet med en metod. Skapa sedan en till bil med egna värden så du får ett car2-objekt. Testa också ett negativt årtal och se varför validering behövs.

Inget bilobjekt är skapat än.

Programmering 2-koppling: honk() läser objektets data. change_year() ändrar objektets data efter kontroll.

Öva själv

Övning 1: Läs temperaturen

Skapa klassen Temperatur med attributet grader. Lägg till den läsande metoden visa(), som skriver ut temperaturen, och metoden ar_frysgrader(), som returnerar True om temperaturen är högst 0, annars False. Metoderna ska inte ändra objektet.

Testa programmet med

  • en temperatur över 0.
  • temperaturen 0.
  • en temperatur under 0.

Fundera: Hur vet du att metoderna är läsande?

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

Övning 2: Tänd och släck en lampa

Skapa klassen Lampa. Attributet ar_tand ska vara False när objektet skapas. Lägg till metoderna tand(), slack() och visa_status(). De två första metoderna ska ändra objektets tillstånd och den sista ska läsa och skriva ut det.

Kontrollera programmet

  • Lampan ska vara släckt från början.
  • tand() ska ändra status till tänd.
  • slack() ska ändra status tillbaka till släckt.

Fundera: Vilka metoder ändrar ett attribut och vilken metod läser bara attributet?

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

Övning 3: Ändra ett produktpris

Skapa klassen Produkt med attributen namn och pris. Skriv metoden andra_pris(nytt_pris), som bara ändrar priset om det nya priset är större än 0. Vid ett ogiltigt pris ska ett felmeddelande visas. Lägg också till en läsande metod som visar produktens uppgifter.

Testa metoden med

  • ett giltigt nytt pris.
  • priset 0.
  • ett negativt pris.

Fundera: Varför är det bättre att ändra priset med en metod än direkt med punktnotation?

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

Övning 4: Spelare som tar skada

Skapa klassen Spelare med attributen namn och liv. Skriv metoden ta_skada(skada). En positiv skada ska minska spelarens liv, men livet får aldrig bli mindre än 0. Om skadan inte är positiv ska ett felmeddelande visas. Lägg till metoderna ar_vid_liv(), som returnerar ett booleskt värde, och visa_status().

Testa programmet genom att

  • ge spelaren mindre skada än det återstående livet.
  • ge spelaren mer skada än det återstående livet.
  • försöka använda en negativ skada.

Fundera: Vilka två kontroller behövs innan objektets nya tillstånd är bestämt?

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

Övning 5: Överföring mellan konton

Svårare övning: Här låter du en validerande metod ändra två olika objekt.

Skapa klassen Konto med attributen agare och saldo. Lägg till metoderna satt_in(belopp), ta_ut(belopp) och overfor(mottagare, belopp). Belopp måste vara större än 0, och ett uttag eller en överföring får bara göras om det finns tillräckligt med pengar. Vid en godkänd överföring ska avsändarens saldo minska och mottagarens saldo öka.

Testa programmet med

  • en giltig insättning och ett giltigt uttag.
  • ett uttag som är större än saldot.
  • en giltig överföring mellan två kontoobjekt.
  • ett negativt belopp.

Fundera: Vilket objekt är self och vilket objekt finns i parametern mottagare under överföringen?

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

Övning 6: Bibliotek med utlåning

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

Skapa klassen Bok med attributen titel och ar_utlanad. Lägg till metoderna lana_ut(), lamna_tillbaka() och visa_info(). En bok får inte lånas ut om den redan är utlånad och får inte lämnas tillbaka om den redan finns inne. Skapa flera bokobjekt i en lista och bygg en meny där användaren kan visa alla böcker, låna en bok, lämna tillbaka en bok eller avsluta.

Testa programmet genom att

  • låna en bok som finns inne.
  • försöka låna samma bok två gånger.
  • lämna tillbaka boken och försöka lämna tillbaka den igen.
  • söka efter en titel som inte finns.
  • göra ett ogiltigt menyval och sedan avsluta.

Fundera: Vilka regler ansvarar bokobjektet för och vilka delar ansvarar menyprogrammet för?

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

Sammanfattning

  • Läsande metoder använder objektets data utan att ändra den.
  • Ändrande metoder uppdaterar objektets attribut.
  • Metoder kan validera nya värden innan objektet ändras.
  • Metoder med parametrar kan ta emot nya värden, till exempel new_year.

Tillbaka till Kapitel 3