Ga naar hoofdinhoud

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.