15b Meer attributen
Een hond heeft meer dan een naam. Elk gegeven dat een object onthoudt, heet
een attribuut. Wil je er meer, dan krijgt __init__ meer parameters:
class Hond:
def __init__(self, naam, leeftijd):
self.naam = naam
self.leeftijd = leeftijd
rex = Hond("Rex", 3)
bello = Hond("Bello", 7)
print(f"{rex.naam} is {rex.leeftijd} jaar.")
print(f"{bello.naam} is {bello.leeftijd} jaar.")
Uitvoer:
Rex is 3 jaar.
Bello is 7 jaar.
De waarden gaan in dezelfde volgorde mee als de parameters: "Rex" wordt
naam, 3 wordt leeftijd. Elke parameter krijgt in __init__ een eigen
regel met self. ervoor.
Klasse of dictionary?
Met een dictionary kon je hetzelfde bewaren:
rex = {"naam": "Rex", "leeftijd": 3}
print(rex["leeftijd"])
Uitvoer:
3
Het verschil zie je als je een naam verkeerd leest. Bij de dictionary krijg je
KeyError: 'lefetijd'. Bij een object zegt Python er ook bij wat je
waarschijnlijk bedoelde, zoals je hieronder ziet. En de klasse legt in
__init__ vast welke attributen elke hond heeft, zodat geen enkele hond er
een mist.
Bij het toewijzen helpt Python je niet: rex.lefetijd = 4 maakt stil een
nieuw attribuut, net zoals rex["lefetijd"] = 4 stil een nieuwe sleutel maakt.
Er gaat iets mis
class Hond:
def __init__(self, naam, leeftijd):
self.naam = naam
self.leeftijd = leeftijd
rex = Hond("Rex", 3)
print(rex.leefijd)
Uitvoer:
AttributeError: 'Hond' object has no attribute 'leefijd'. Did you mean: 'leeftijd'?
Een tikfout in de naam van een attribuut geeft een AttributeError. Python
raadt er vaak bij wat je bedoelde.
Opdracht 15b.1: Boeken
Maak een klasse Boek met de attributen titel, schrijver en
bladzijden. Maak twee boeken en print van allebei een regel.
Verwachte uitvoer:
De Hobbit door J.R.R. Tolkien, 320 bladzijden
Matilda door Roald Dahl, 240 bladzijden
class Boek:
def __init__(self, titel):
self.titel = titel
hobbit = Boek("De Hobbit")
print(hobbit.titel)Klik hier voor een tip.
__init__ krijgt vier parameters: self, titel, schrijver en
bladzijden. Bewaar elk als self.titel = titel, enzovoort.
Klik hier voor de oplossing.
class Boek:
def __init__(self, titel, schrijver, bladzijden):
self.titel = titel
self.schrijver = schrijver
self.bladzijden = bladzijden
hobbit = Boek("De Hobbit", "J.R.R. Tolkien", 320)
matilda = Boek("Matilda", "Roald Dahl", 240)
print(f"{hobbit.titel} door {hobbit.schrijver}, {hobbit.bladzijden} bladzijden")
print(f"{matilda.titel} door {matilda.schrijver}, {matilda.bladzijden} bladzijden")
Uitvoer:
De Hobbit door J.R.R. Tolkien, 320 bladzijden
Matilda door Roald Dahl, 240 bladzijden
Opdracht 15b.2: Van dictionary naar klasse
Zet de dictionary hieronder om naar een object van een klasse Film. Print
daarna de titel en het jaar via de attributen.
Verwachte uitvoer:
Up (2009)
film = {"titel": "Up", "jaar": 2009, "minuten": 96}
# Schrijf hier de klasse Film en maak er een object van
print(f"{film['titel']} ({film['jaar']})")Klik hier voor een tip.
Elke sleutel van de dictionary wordt een attribuut. Maak het object met
Film(film["titel"], film["jaar"], film["minuten"]).
Klik hier voor de oplossing.
film = {"titel": "Up", "jaar": 2009, "minuten": 96}
class Film:
def __init__(self, titel, jaar, minuten):
self.titel = titel
self.jaar = jaar
self.minuten = minuten
up = Film(film["titel"], film["jaar"], film["minuten"])
print(f"{up.titel} ({up.jaar})")
Uitvoer:
Up (2009)
Waar je eerst film["titel"] schreef, schrijf je nu up.titel.