Een voorbeeld van een OO-visie op het oplossen van een probleem: een jaarprogramma en een opleidingsonderdeel of vak

We wensen een applicatie te ontwikkelen om het isp (individueel studieprogramma of jaarprogramma) van een student bij te houden en hierop een aantal berekeningen te doen (zoals het totaal aantal studiepunten over een jaar, een lijst met namen van alle vakken gesorteerd van meeste naar minste studiepunten,…).

We wensen dus in eerste instantie informatie bij te houden over een opleidingsonderdeel of vak. Vanuit de OO visie zullen we dan ook een klasse Vak maken die alle informatie van een vak bijhoudt. Het is de gewoonte om namen van klassen te laten beginnen met een hoofdletter. Een klasse is een beschrijving van welke eigenschappen objecten van deze klasse (specifieke vakken in dit geval, bijvoorbeeld het vak met naam “Programming 1” dat 6 studiepunten telt) hebben, hoe de objecten van deze klassen gemaakt kunnen worden en welke methodes op deze vakobjecten kunnen toegepast worden. In plaats van eigenschappen van een object spreken we ook wel eens over de attributen van een object.

Welke zijn de eigenschappen die we wensen bij te houden over een vak? Voor een vak zijn we geïnteresseerd in het aantal studiepunten van een vak (aangezien we voor een jaarprogramma de som van de studiepunten van alle vakken in het jaarprogramma wensen te kunnen berekenen) en de naam van een vak (aangezien we voor een jaarprogramma een lijst van namen van vakken willen genereren). Bovendien zullen we nieuwe vakobjecten moeten kunnen maken op basis van een gegeven naam en gegeven studiepunten en wensen we de naam en het aantal studiepunten te kunnen raadplegen van een specifiek vakobject.

Welke zijn de eigenschappen die we wensen bij te houden van een student? Voor deze applicatie zijn we enkel geïnteresseerd in het jaarprogramma van de student. Dus de enige eigenschap is een verzameling van vak-objecten die het jaarprogramma bevat van de student. Wanneer een student-object wordt aangemaakt hebben we geen bijkomende informatie nodig. We zullen een methode nodig hebben om een nieuw vak-object aan de verzameling toe te voegen. We zullen een methode nodig hebben om het totaal aantal studiepunten van alle vak-objecten in de verzameling te berekenen. En we zullen een methode nodig hebben om een lijst van strings te genereren van alle namen van de vak-objecten in het jaarprogramma gesorteerd in dalende volgorde van studiepunten.

Klassen en objecten

In de object-georiënteerde wereld behoort iedere onderscheidbare entiteit tot een klasse (Engels: “class”). Een klasse is een generiek model voor een groep entiteiten. De klasse beschrijft alle attributen (of eigenschappen) die de entiteiten gemeen hebben, en beschrijft de methodes die de klasse aanbiedt waarmee de wereld buiten de klasse invloed op de klasse kan uitoefenen.

Op zichzelf is een klasse geen entiteit, maar een beschrijving van de entiteiten van deze klasse. Een entiteit die behoort tot een klasse, wordt een “object” genoemd. De terminologie is dat een object een “instantie” (soms: “instantiatie,” maar dat is geen correct Nederlands) is van een bepaalde klasse. Een klasse beschrijft attributen, maar een object dat een instantie is van de klasse geeft waardes aan de attributen. En hoewel een klasse de methodes beschrijft die hij ondersteunt, kun je een methode alleen uitvoeren voor een object dat een instantie is van de klasse.

Een klasse is een data type, een object is een waarde.

Klassen en data types in Python

De meeste object-georiënteerde programmeertalen kennen een aantal basale data types, en staan je toe om klassen te definiëren, wat neerkomt op het definiëren van nieuwe data types. Dit gold ook voor Python tot en met versie 2. Sinds Python 3 is echter ieder data type een klasse.

Je kunt dit deels zien aan de manier waarop een groot aantal functionaliteiten van basale data types in Python geïmplementeerd zijn als methodes. Een methode wordt altijd aangeroepen via de syntax <variabele>.<methode>(), in tegenstelling tot functies, die worden aangeroepen als <functie>( <variabele> ). Het feit, bijvoorbeeld, dat als je een kleine-letter-versie van een string wilt creëren, je dit effectueert middels <string>.lower() geeft al aan dat een string een instantie van een klasse is.

Maar niet alleen strings zijn instanties van klassen: integers en floats zijn dat ook. Ze hebben zelfs methodes, maar die worden zelden expliciet aangeroepen. Methodes worden vaak wel impliciet aangeroepen, bijvoorbeeld, als je twee getallen optelt met \(+\), is dat eigenlijk de aanroep van een methode.