1 Oefeningen classes 2021-03-08¶
1.1 Opgave¶
Schrijf een class Playstation met 1 method start_spel die een parameter game krijgt.
Je moet de class als volgt kunnen gebruiken:
console = Playstation()
console.start_spel("Fortnite")
Op het scherm moet dan het volgende verschijnen:
[PS] spel gestart: Fortnite
1.2 Opgave¶
Voeg een 1 method toon_spel toe aan je class Playstation.
Je moet de class als volgt kunnen gebruiken:
console = Playstation()
console.start_spel("Fortnite")
console.toon_spel()
We zouden eigenlijk dit willen tonen:
[PS] spel gestart: Fortnite
[PS] huidig spel is: Fortnite
Maar met de eenvoudige implementatie van de vorige opgave is dit nog niet mogelijk.
Dus voorlopig moet op het scherm moet dan het volgende verschijnen:
[PS] spel gestart: Fortnite
[PS] huidig spel is: ?
1.3 Opgave¶
Pas je class Playstation aan zodat je de class als volgt kunt gebruiken:
console = Playstation()
console.start_spel("Fortnite")
console.toon_spel()
console.start_spel("Witcher")
console.toon_spel()
En dat op het scherm het volgende verschijnt:
[PS] spel gestart: Fortnite
[PS] huidig spel is: Fortnite
[PS] spel gestart: Witcher
[PS] huidig spel is: Fortnite
Hiervoor dien je “state” (data) aan je class toe te voegen.
Tips:
voeg een __init__ methode toe
voeg een property huidig_spel toe
pas de property aan in start_spel
gebruik de property in toon_spel
1.4 Opgave¶
Pas je class Playstation aan zodat je de eigenaar kunt aangeven:
console = Playstation("Alexander")
console.start_spel("Fortnite")
console.toon_spel()
En dat op het scherm het volgende verschijnt:
[PS] spel gestart: Fortnite op console Alexander
[PS] huidig spel is: Fortnite console Alexander
1.5 Opgave¶
Probeer onderstaande code met je class:
console1 = Playstation("Alexander")
console2 = Playstation("Zarah")
console1.start_spel("Fortnite")
console2.start_spel("Rayman")
console1.toon_spel()
console2.toon_spel()
Dit zou op je scherm moeten verschijnen:
[PS] spel gestart: Fortnite op console Alexander
[PS] spel gestart: Rayman op console Zarah
[PS] huidig spel is: Fortnite console Alexander
[PS] huidig spel is: Rayman console Zarah
Is dit niet het geval? Pas je code dan aan zodat dit wel het geval is.
1.6 Opgave¶
Voeg een method stop_spel toe aan je class Playstation die geen parameters heeft (buiten self), en die de property huidig_spel naar de startwaarde terugzet (None):
console1 = Playstation("Alexander")
console2 = Playstation("Zarah")
console1.start_spel("Fortnite")
console2.start_spel("Rayman")
console1.stop_spel()
console1.toon_spel()
console2.toon_spel()
Zorg ervoor dat dit op het scherm verschijnt:
[PS] spel gestart: Fortnite op console Alexander
[PS] spel gestart: Rayman op console Zarah
[PS] huidig spel is: None console Alexander
[PS] huidig spel is: Rayman console Zarah
1.7 Opgave¶
Pas method toon_spel aan zodat dit op het scherm verschijnt:
[PS] spel gestart: Fortnite op console Alexander
[PS] spel gestart: Rayman op console Zarah
[PS] geen spel actief op console Alexander
[PS] huidig spel is: Rayman console Zarah
1.8 Opgave¶
Voeg een class XBox toe zodat we de code zo kunnen gebruiken:
console1 = Playstation("Alexander")
console2 = XBox("Zarah")
console1.start_spel("Fortnite")
console2.start_spel("Rayman")
console1.stop_spel()
console1.toon_spel()
console2.toon_spel()
En dat deze uitvoer op het scherm verschijnt:
[PS] spel gestart: Fortnite op console Alexander
[XBox] spel gestart: Rayman op console Zarah
[PS] geen spel actief op console Alexander
[XBox] huidig spel is: Rayman console Zarah
Tip: Je moet de code van class Playstation voor class XBox copy en pasten voor deze opgave. Dit om een concept duidelijk te maken 🙈
1.9 Opgave¶
In de vorige opgave moest je de code copy en pasten. Dit is echter een bijzonder slechte aanpak:
Het aantal regels code verdubbelt.
Als er een bug in de code voor de Playstation class zit, zit deze nu ook in de code voor XBox en dien je het probleem 2 maal op te lossen.
Hoe meer regels code, hoe moeilijker om de code te lezen door derden of door jezelf in de toekomst.
Dus, pas de code uit de vorige opgave aan zodat je geen regels code hoeft te dupliceren. De functionaliteit van de code moet onaangepast blijven. (Er mag voor de uitvoer nog steeds “[PS]” voor de code van de XBox verschijnen, dit lossen we in de volgende opgave op.
Dus deze uitvoer moet verschijnen, hoewel de console van Zarah een XBox is:
[PS] spel gestart: Fortnite op console Alexander
[PS] spel gestart: Rayman op console Zarah
[PS] geen spel actief op console Alexander
[PS] huidig spel is: Rayman console Zarah
Info: Het aanpassen van code om deze “beter” te maken zonder de functionaliteit aan te passen noemt men “refactoring”.
Tips:
Voeg een nieuwe class toe Gameconsole.
Laat class Playstation en XBox erven van deze class Gameconsole.
Voorbeeld code:
class Playstation(Gameconsole):
pass
Hiermee zeggen we dat Playstation een Gameconsole is. En in de praktijk betekent dit dat de code voor Gameconsole gebruikt wordt als je een object van class Playstation maakt:
console = Playstation()
console.toon_spel() # dit roept code in Gameconsole op
1.10 Opgave¶
In de vorige opgave bleef je zitten met uitvoer die foutief aangaf dat de console van Zarah een Playstation was.
Om dit te corrigeren dienen we de code aan te passen:
Voeg een property soort toe aan de Gameconsole class die aangeeft welk soort gameconsole we gebruiken.
Gebruik deze property om de correcte uitvoer te krijgen.
Gebruik f-strings om de uitvoer aan te passen naar gelang de soort console gebruikt wordt.
Je moet de code als volgt kunnen gebruiken:
console1 = Playstation("Alexander")
console1.soort = "PS"
console2 = XBox("Zarah")
console2.soort = "XBox"
console1.start_spel("Fortnite")
console2.start_spel("Rayman")
console1.stop_spel()
console1.toon_spel()
console2.toon_spel()
Info: Dit is eigenlijk geen goede manier van werken, maar in de volgende opgave corrigeren we onze aanpak.
Dit dient de uitvoer te zijn:
[PS] spel gestart: Fortnite op console Alexander
[XBox] spel gestart: Rayman op console Zarah
[PS] geen spel actief op console Alexander
[XBox] huidig spel is: Rayman console Zarah
1.11 Opgave¶
Zorg ervoor dat de code als volgt gebruikt kan worden:
console1 = Playstation("Alexander")
console2 = XBox("Zarah")
console1.start_spel("Fortnite")
console2.start_spel("Rayman")
console1.stop_spel()
console1.toon_spel()
console2.toon_spel()
De uitvoer dient identiek te zijn aan de vorige opgave:
[PS] spel gestart: Fortnite op console Alexander
[XBox] spel gestart: Rayman op console Zarah
[PS] geen spel actief op console Alexander
[XBox] huidig spel is: Rayman console Zarah
Je dient de classes Playstation en XBox aan te passen, zodat ze een __init__ hebben. In deze __init__ method, stel je per class de correcte soortnaam in.
De __init__ method heeft de zelfde signature als de __init__ method in Gameconsole (de parent-class):
def __init__(self, eigenaar)
In deze method dien je de __init__ method van de parent-class op te roepen. Dit doe je als volgt:
super().__init__(eigenaar)
Hierna stel je de property soort in met “PS” voor de Playstation class, en “XBox” voor de XBox class.
1.12 Opgave¶
Voeg nu een class Switch toe zodat je de code als volgt kunt gebruiken:
console1 = Playstation("Alexander")
console2 = XBox("Zarah")
console3 = Switch("Andreas")
console1.start_spel("Fortnite")
console2.start_spel("Rayman")
console3.start_spel("Mario Kart 8")
console1.stop_spel()
console1.toon_spel()
console2.toon_spel()
console3.toon_spel()
De volgende uitvoer dient te verschijnen:
[PS] spel gestart: Fortnite op console Alexander
[XBox] spel gestart: Rayman op console Zarah
[Switch] spel gestart: Mario Kart 8 op console Andreas
[PS] geen spel actief op console Alexander
[XBox] huidig spel is: Rayman console Zarah
[Switch] huidig spel is: Mario Kart 8 console Andreas
Tip: Hiervoor moet je slechts 4 regels code toevoegen. Dit toont een van de voordelen van object-georienteerd programmeren aan: Hergebruik van code.