Classes

Zie boek “De Programmeursleerling” hoofdstuk 20 pagina 253.

Introductie

We zagen hoe we stukjes code kunnen groeperen in een functie, en via parameters het effect ervan kunnen varieren.

Een functie kan echter geen gegevens bijhouden. Python voorziet echter classes om gegevens samen met functies te groeperen. Een voorbeeld:

class Persoon:
    def __init__(self, naam, woonplaats):
        self.naam = naam
        self.woonplaats = woonplaats


p = Persoon("Jan", "Limburg")
print(p.naam)

In bovenstaand voorbeeld noemen we “Persoon” een klasse of class. De class Persoon groepeert de naam en woonplaats van een persoon. En “p” noemen we een object. Soms wordt een class ook wel vergeleken met een stempel, en het object een afdruk van die stempel.

We hebben er nog geen andere extra functionaliteit aan toegevoegd, dus het afdrukken doen we nog via de gewone functie print.

Opgave 54

Kopieer bovenstaande code, en pas de code aan zodat ook de leeftijd doorgegeven kan worden bij het aanmaken van een persoon:

p = Persoon("Jan", "Limburg", 29)
print(p.leeftijd) # toont 29

Methods

We kunnen nu ook extra functionaliteit aan die class toevoegen:

class Persoon:
    def __init__(self, naam, woonplaats):
        self.naam = naam
        self.woonplaats = woonplaats

    def schrijf(self):
        print(f"Hallo, mijn naam is {self.naam} en ik woon in {self.woonplaats}.")

p = Persoon("Jan", "Limburg")
p.schrijf()

In bovenstaand voorbeeld zit de functionaliteit om de gegevens van de persoon af te drukken in de class zelf. Functie die in een class gedefinieerd worden noemen we “methods”. In ons voorbeeld is “schrijf” dus een “method”.

Opgave 55

Voeg de methode schrijf toe aan je eigen code uit opgave 54. Voeg een method “schrijf_naam” toe die enkel de naam van de persoon afdrukt.

Opgave 56

Maak een class “Enemy” die de x- en y-coordinaten en x_change en y_change van een vijand bijhoudt.

Instances

Het grote voordeel van zo’n classes is dat we nu meerdere personen (of vijanden) kunnen aanmaken:

piet = Persoon("Piet", "Maaseik")
persoon3 = Persoon("Joris", "Lanklaar")
persoon4 = Persoon("Corneel", "Genk")

piet.schrijf()
persoon3.schrijf()
persoon4.schrijf()

Daarom vergelijkt men classes soms met stempels en de objecten met de afdrukken ervan. In bovenstaande code zie je dat we door middel van de class Persoon, meerdere objecten aanmaken die heel gelijkaardig zijn: Ze hebben allemaal een naam en woonplaats, en een method “schrijf”.

Met de Enemy class die je aanmaakte kunnen dus ook meerdere vijanden in je spel aangemaakt worden:

vijand1 = Enemy(100, 0, 0, 1) # langzame vijand
vijand2 = Enemy(100, 0, 0, 5) # snelle vijand

Opgave 57

Voorzie een method “schrijf” die deze coordinaten op het scherm afdrukt met print.

Opgave 58

Voeg een method “update” toe aan je class Enemy uit opgave 57, waarin de nieuwe positie van je vijand berekend wordt, gebruik makend van x, x_change, y en y_change.

Opgave 59

Implementeer een class Cirkel waarmee je de omtrek en oppervlakte van een Cirkel kan berekenen:

c = Cirkel(r=3)
print(c.omtrek()) # toont 18.85
print(c.oppervlakte()) # toont 28.27
print(c) # toont: cirkel met straal 3