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:
brandochyearsparas 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.
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.