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: skriv egna metoder

  1. Skapa filen kap3-3-car.py.
  2. Skriv klassen Car med attributen brand och year.
  3. Skriv metoden honk() som visar bilens märke och årtal utan att ändra objektet.
  4. Skriv metoden change_year(new_year) som bara ändrar årtalet om det är större än 0.
  5. Skriv metoden is_old() som returnerar True om bilen är äldre än 20 år, annars False.
  6. Testa med ett giltigt årtal, ett negativt årtal och två olika bilobjekt.

När du har försökt själv kan du ladda ner ett lösningsförslag: kap3-3-car-losningsforslag.py

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