.. sectnum:: Oefeningen classes 2021-03-08 ============================= 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 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: ? 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` 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 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. 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 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 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 🙈 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 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 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. 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.