Kap 3.3
Metoder som ändrar objekt
Metoder kan läsa objektets data, men också ändra den.
Mål
Efter lektionen ska du kunna...
- skriva metoder som läser attribut
- skriva metoder som ändrar attribut
- förklara varför metoder kan vara bättre än direkt ändring
- använda enkel validering innan objektet ändras
Repetition
Objekt har tillstånd
car1 = Car("Volvo", 2020)
Objektets tillstånd är värdena i attributen.
Här är brand "Volvo" och year 2020.
Begrepp
Två typer av metoder
- Läsande metod: använder data utan att ändra objektet.
- Ändrande metod: uppdaterar ett eller flera attribut.
- Validering: kontrollerar värdet innan ändringen görs.
Klass
Start: Car
class Car:
def __init__(self, brand, year):
self.brand = brand
self.year = year
brand och year sparas som instansvariabler.
Läsande metod
honk() ändrar inget
def honk(self):
print(f"{self.brand} från {self.year} tutar!")
Metoden läser self.brand och self.year.
Den skriver ut text, men ändrar inte objektet.
Använd
Skapa bil och tuta
car1 = Car("Volvo", 2020)
car1.honk()
Volvo från 2020 tutar!
Efter metoden är bilen fortfarande en Volvo från 2020.
Flera objekt
Samma metod, olika data
car1 = Car("Volvo", 2020)
car2 = Car("Toyota", 2018)
car1.honk()
car2.honk()
self betyder olika objekt beroende på vilket objekt metoden körs på.
Ändrande metod
Ändra objektets år
def change_year(self, new_year):
self.year = new_year
new_year är ett nytt värde som skickas in.
self.year ändras i objektet.
Före och efter
Objektet får nytt tillstånd
car1 = Car("Volvo", 2020)
car1.honk()
car1.change_year(2023)
car1.honk()
Volvo från 2020 tutar!
Volvo från 2023 tutar!
Parameter
Vad är new_year?
def change_year(self, new_year):
self.year = new_year
car1.change_year(2023)
new_yearär parametern.2023är argumentet.- Argumentet sparas i
self.year.
Direkt ändring
Det går att skriva så här
car1.year = 2023
Det ändrar attributet direkt.
Men ingen kontroll görs.
Därför är metoder som kontrollerar innan ändringen bättre.
Validering
Kontrollera innan ändring
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 orimliga värden.
Exempel
Fel värde stoppas
car1 = Car("Volvo", 2020)
car1.change_year(-5)
car1.honk()
Årtalet måste vara större än 0.
Volvo från 2020 tutar!
Årtalet ändras inte.
Returnera
Metod som svarar sant eller falskt
def is_old(self):
return self.year < 2004
Metoden kan returnera True eller False.
Den ändrar inte objektet.
Hela klassen
Car med tre metoder
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):
if new_year > 0:
self.year = new_year
else:
print("Årtalet måste vara större än 0.")
def is_old(self):
return self.year < 2004
Öva
kap3-3-car.py
- Skapa klassen
Car. - Lägg till
brandochyear. - Skriv
honk(). - Skriv
change_year(new_year)med kontroll. - Skriv
is_old(). - Testa giltigt år, negativt år och två objekt.
Sammanfattning
Kom ihåg
- Läsande metoder använder data utan att ändra objektet.
- Ändrande metoder uppdaterar attribut.
- Metoder kan kontrollera värden innan ändring.
- Parametrar gör att metoder kan ta emot nya värden.
- Objektets tillstånd är värdena det har just nu.