T. Issaris
22 Februari 2021
Keyword class
Hoe voegen we data toe?
Een variabele in een class noemen we een property.
Definieer een class Auto met als properties bouwjaar, naam en topsnelheid.
Met een class maak je instances van je class ook wel objecten genoemd:
Als je je object afdrukt, zegt Python je dat hond een object is van het type Hond, in de hoofdmodule __main__.
Je kan ook meerdere instances van je class aanmaken:
class Hond:
naam = "Odie"
leeftijd = 2
hond1 = Hond()
hond2 = Hond()
print(hond1) # toont <__main__.Hond object at 0x7f53b9a87970>
print(hond2) # toont <__main__.Hond object at 0x7f53b9a87970>hond1 en hond2 zijn objecten van class Hond.
Met de “.” operator krijg je toegang tot de properties van je objecten:
Properties worden per instance bijgehouden, properties worden dus niet gedeeld:
class Hond:
naam = "Odie"
leeftijd = 2
hond1 = Hond()
hond2 = Hond()
hond2.naam = "Max"
print(hond1.naam) # toont Odie
print(hond2.naam) # toont MaxHoewel property hond2.naam gewijzigd werd, blijft property hond1.naam onaangepast.
Kopieer de code uit oefening 1. Pas de code aan zodat je twee objecten aanmaakt model3 en taycan. Pas de properties aan zodat ze overeenkomen met de Tesla Model 3 en Porsche Taycan.
Een class kan je zien als een stempel: Net zoals de vorm van de stempel bepaalt wat voor afdrukken je ervan kunt maken, bepaalt de class wat voor objecten je kan maken.
Hoe voegen we code toe?
Een functie in een class noemen we een method.
We kunnen deze method nu oproepen op onze objecten:
selfOnze method kan properties gebruiken via de speciale eerste parameter van elke method (bij conventie self genaamd):
Kopieer de code uit oefening 2. Voeg een method toon_eigenschappen toe die zowel het bouwjaar, de naam als de topsnelheid afdrukt. Gebruik de method toon_eigenschappen op beide objecten model3 en taycan met behulp van de dot-operator.
Functienamen die beginnen en eindigen met __ worden magische functies genoemd.

Als we een object proberen af te drukken, krijgen we volgende uitvoer:
__str__ is een magische functie die gebruikt wordt om een object naar een string te converteren.
Kopieer de code uit oefening 3. Voeg de magic method __str__ toe die de naam en het bouwjaar van de Auto teruggeeft met behulp van een f-string.
Print beide objecten model3 en taycan en merk op dat de naam en het bouwjaar van de auto afgedrukt worden.
__init__ is een andere magische functie die gebruikt wordt om de inhoud van een object te initialiseren.
Je kan __init__ parameters meegeven:
Kopieer de code uit oefening 4. Voeg de magic method __init__ toe die de naam van de auto als parameter neemt, en deze in self.naam opslaat.
We kunnen dan via self verwijzen naar onze eigen property naam:
Kopieer de code uit oefening 5.
Voeg de method toon_informatie toe die de naam, het bouwjaar en de topsnelheid op het scherm afdrukt. Voer de methode voor de objecten model3 en taycan uit.
Kopieer de code uit oefening 6a.
Voeg de method is_snel toe die True teruggeeft als de auto sneller dan 200 km/h kan rijden, en False in het andere geval.
Je kan ook meerdere parameters voorzien in “init”:
Kopieer de code uit oefening 6.
Pas de method __init__ aan, zodat niet enkel de naam, maar ook het bouwjaar en de topsnelheid via deze method ingesteld kunnen worden.
Pas het aanmaken van de objecten model3 en taycan aan, zodat de naam, het bouwjaar en de topsnelheid doorgegeven worden aan de __init__ functie.
Aanpassen van data in class:
Uiteraard kunnen classes ook complexere data bevatten zoals b.v. lijsten:
Maak een class Movie. Voeg een property ratings toe. Ratings is een lijst van scores tussen 1 en 5.
Voeg een method add_rating toe, die de rating aan de lijst toevoegt.
class Rapport:
def __init__(self):
self.punten = []
def voeg_score_toe(self, score):
self.punten.append(score)
def gemiddelde(self):
return sum(self.punten)/len(self.punten)
r = Rapport()
r.voeg_score_toe(7)
r.voeg_score_toe(9)
gemiddelde = r.gemiddelde()
print(f"Gemiddelde is: {gemiddelde}")
# Gemiddelde is: 8.0Kopieer de code van oefening 8.
Voeg een method som toe, die de som van alle ratings teruggeeft.
Voeg een method gemiddelde toe, die het gemiddelde van alle ratings teruggeeft.
class Rapport:
def __init__(self):
self.punten = []
def voeg_score_toe(self, score):
self.punten.append(score)
def gemiddelde(self):
return sum(self.punten)/len(self.punten)
def maximum(self):
return max(self.punten)
r = Rapport()
r.voeg_score_toe(7)
r.voeg_score_toe(9)
gemiddelde = r.gemiddelde()
print(f"Gemiddelde is: {gemiddelde}, max is {r.maximum()}")
# Gemiddelde is: 8.0, max is 9Kopieer de code van oefening 9.
Voeg een method minimum toe, die de minimum beoordeling van de film teruggeeft.
Welk probleem lossen classes op?
Stel je wil leeftijden van personen bijhouden, en je wil een functie voorzien die de gemiddelde leeftijd berekent. Hoe zou je dit kunnen doen met behulp van lijsten?
Je zou een lijst met integers kunnen bijhouden, en een functie die de gemiddelde leeftijd berekent:
leeftijden = [13, 9, 6]
def gemiddelde(l):
som = 0
for lt in l:
som = som + lt
return som / len(l)
g = gemiddelde(leeftijden)
print(f'gemiddelde leeftijd is: {g}')Een nadeel is dat leeftijden en gemiddelde niet duidelijk met elkaar verbonden zijn.
Een oplossing hiervoor is het gebruik van een class die zowel de data als de functie die erop werkt bevat:
class Weerbericht:
dagen = {
"maandag": 3,
"dinsdag": 3,
"woensdag": 3,
"donderdag": 10,
"vrijdag": 9,
"zaterdag": 5,
"zondag": 3,
}
def warmste_dag(self):
max_temp = -100
max_naam = None
for naam in self.dagen:
t = self.dagen[naam]
if t > max_temp:
max_temp = t
max_naam = naam
return max_temp, max_naam
w = Weerbericht()
print(w.warmste_dag())
# toont: (10, donderdag)Enkele voordelen van classes voor het voorstellen van complexere data zijn:
Stel dat je een Drone wil besturen:
Enkel de persoon die de Drone class implementeert hoeft te weten hoe de drone werkt.
De gebruiker heeft een makkelijke API om de drone te gebruiken.
Dikwijls kunnen complexere systemen eenvoudiger gemodelleerd worden, door gebruik te maken van OOD.
Hierbij maken we classes aan die dingen uit de echte wereld voorstellen. Dit vergemakkelijkt het redeneren over de interacties tussen die objecten.
Zie b.v. de Drone class.
Veel APIs gebruiken classes om het gebruik en de implementatie ervan te vereenvoudigen.
Herinner je dit voorbeeld bij gebruik van dictionaries:
kinderen = {
"Alexander": {"leeftijd": 13, "haarkleur": "bruin"},
"Zarah": {"leeftijd": 9, "haarkleur": "donkerblond"},
"Andreas": {"leeftijd": 6, "haarkleur": "blond"},
}
print(kinderen['Alexander'])
# toont: {'leeftijd': 13, 'haarkleur': 'bruin'}
print(kinderen['Zarah']['haarkleur'])
# toont: 'donkerblond'De code wordt duidelijk mbv classes:
class Kind:
def __init__(self, naam, leeftijd, haarkleur):
self.naam = naam
self.leeftijd = leeftijd
self.haarkleur = haarkleur
kinderen = [
Kind(naam="Alexander", leeftijd=13, haarkleur="bruin"),
Kind(naam="Zarah", leeftijd=9, haarkleur="donkerblond"),
Kind(naam="Andreas", leeftijd=6, haarkleur="blond"),
]
print(kinderen[0].leeftijd) # 13
print(kinderen[1].haarkleur) # donkerblondOf voor makkelijkere toegang:
class Kind:
def __init__(self, naam, leeftijd, haarkleur):
self.naam = naam
self.leeftijd = leeftijd
self.haarkleur = haarkleur
kinderen = {
"Alexander": Kind(naam="Alexander", leeftijd=13, haarkleur="bruin"),
"Zarah": Kind(naam="Zarah", leeftijd=9, haarkleur="donkerblond"),
"Andreas": Kind(naam="Andreas", leeftijd=6, haarkleur="blond"),
}
print(kinderen['Alexander'].leeftijd) # 13
print(kinderen['Zarah'].haarkleur) # donkerblondHerinner je verder ook nog dit voorbeeld:
hobbies = {
"Alexander": {"leeftijd": 13, "hobbies": ["volleybal", "games", "lezen"]},
"Zarah": {"leeftijd": 9, "hobbies": ["volleybal", "games", "muziek", "tekenen"]},
"Andreas": {"leeftijd": 6, "hobbies": ["volleybal", "games"]},
}
print(kinderen['Alexander']['hobbies'])
# toont: ['volleybal', 'games']
print(kinderen['Zarah']['leeftijd'])
# toont: 9
print(kinderen['Andreas']['hobbies'][0])
# toont: volleybalclass Kind:
def __init__(self, naam, leeftijd, hobbies):
self.naam = naam
self.leeftijd = leeftijd
self.hobbies = hobbies
kinderen = {
"Alexander": Kind(naam="Alexander", leeftijd=13, hobbies=["volleybal", "games", "lezen"]),
"Zarah": Kind(naam="Zarah", leeftijd=9, hobbies=["volleybal", "games", "muziek", "tekenen"]),
"Andreas": Kind(naam="Andreas", leeftijd=6, hobbies=["volleybal", "games"]),
}
print(kinderen['Andreas'].hobbies) # ["volleybal", "games"]
print(kinderen['Zarah'].hobbies[0]) # volleybalStel je wil de speler, vijanden en meteoren kunnen voorstellen in een spel:
inheritance