14d Je eerste methode
Attributen zeggen wat een hond ís: een naam, een leeftijd. Een methode zegt wat een hond kan. Het is een functie die je binnen de klasse schrijft:
class Hond:
def __init__(self, naam):
self.naam = naam
def blaf(self):
print(f"{self.naam} zegt: Woef!")
rex = Hond("Rex")
bello = Hond("Bello")
rex.blaf()
bello.blaf()
Uitvoer:
Rex zegt: Woef!
Bello zegt: Woef!
De methode springt in onder class, net als __init__. Je roept hem aan met
een punt, net als een attribuut, maar met haakjes erachter: rex.blaf().
Wat is self?
Bij rex.blaf() vult Python self zelf in met het object vóór de punt:
rex. Daarom print dezelfde methode één keer "Rex" en één keer "Bello".
Elke methode heeft self als eerste parameter. Bij het aanroepen schrijf je
hem nooit zelf: rex.blaf(), niet rex.blaf(rex).
Er gaat iets mis
self vergeten
class Hond:
def blaf():
print("Woef!")
rex = Hond()
rex.blaf()
Uitvoer:
TypeError: Hond.blaf() takes 0 positional arguments but 1 was given
Jij geeft geen argument mee, en toch zegt Python dat er één binnenkomt. Dat
is rex: Python geeft het object altijd mee als eerste argument. Zet self
bovenaan de parameters: def blaf(self):.
De haakjes vergeten
class Hond:
def blaf(self):
print("Woef!")
rex = Hond()
print(rex.blaf)
Uitvoer:
<bound method Hond.blaf of <__main__.Hond object at 0x7f3a2c1b8d10>>
Zonder haakjes roep je de methode niet aan, maar vraag je de methode zelf
op. Python print dan wat het is, met een geheugenadres dat bij jou anders
is. Schrijf rex.blaf().
Opdracht 14d.1: Miauw
Geef de klasse Kat een methode miauw().
Verwachte uitvoer:
Minoes zegt: Miauw.
Garfield zegt: Miauw.
class Kat:
def __init__(self, naam):
self.naam = naam
minoes = Kat("Minoes")
garfield = Kat("Garfield")
print("Nog te doen")Klik hier voor een tip.
def miauw(self): onder __init__, op dezelfde inspringing. Aanroepen doe
je met minoes.miauw().
Klik hier voor de oplossing.
class Kat:
def __init__(self, naam):
self.naam = naam
def miauw(self):
print(f"{self.naam} zegt: Miauw.")
minoes = Kat("Minoes")
garfield = Kat("Garfield")
minoes.miauw()
garfield.miauw()
Uitvoer:
Minoes zegt: Miauw.
Garfield zegt: Miauw.
Opdracht 14d.2: Een boek beschrijven
In 14b schreef je voor elk boek dezelfde lange f-string. Zet die in een
methode beschrijf(), zodat elke regel korter wordt.
Verwachte uitvoer:
De Hobbit door J.R.R. Tolkien, 320 bladzijden
Matilda door Roald Dahl, 240 bladzijden
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")Klik hier voor een tip.
In de methode heet het boek self. Waar nu hobbit.titel staat, schrijf je
in de methode self.titel.
Klik hier voor de oplossing.
class Boek:
def __init__(self, titel, schrijver, bladzijden):
self.titel = titel
self.schrijver = schrijver
self.bladzijden = bladzijden
def beschrijf(self):
print(f"{self.titel} door {self.schrijver}, {self.bladzijden} bladzijden")
hobbit = Boek("De Hobbit", "J.R.R. Tolkien", 320)
matilda = Boek("Matilda", "Roald Dahl", 240)
hobbit.beschrijf()
matilda.beschrijf()
Uitvoer:
De Hobbit door J.R.R. Tolkien, 320 bladzijden
Matilda door Roald Dahl, 240 bladzijden