Classes in Python

Op deze pagina:

Met een class kan je een eigen datatype maken die aan je eigen regels voldoet. Een class is dus een blueprint of sjabloon.

Een class kan eigen variabelen hebben, deze worden attributen genoemd.

Een class kan eigen functies hebben: "methoden".

Er zijn ook "special methods", methoden die al in Python zijn ingebouwd en voor meerdere datatypen gebruikt worden. Deze speciale methoden hebben namen die beginnen en eindigen met twee underscores, bijvoorbeeld: __add__() en __len__(). Een methode waarvan de naam met twee underscores begint wordt ook wel dunder genoemd.

Als je een class maakt, dan kan je deze special methods ook herdefiniëren voor die class.

Als je een variabele maakt op basis van een class, dan maak je een exemplaar (instance) van een object. Dat object heeft attributen. De methoden van de class zijn callable attributen, de variabelen van die class zijn data attributen.

Een object maken doe je door een variabele toe te wijzen aan een class:


x = MijnClass()

of, als je parameters meegeeft:


x = MijnClass(3,5,'test')

De variabelen die een object als exemplaar van de class krijgt, zijn uniek voor dat object. Ze worden instance variabelen genoemd.

Variabelen van een object kunnen ook als "property" van een object worden gebruikt. De toegang en validatie van deze variabele wordt dan geregeld met methoden van de class.

Methoden van een class

Een methode is gewoon een functie van een class die als eerste argument het exemplaar heeft waar het op werkt, meestal is dit 'self'.


def kwadraat(self, x):
    return x * x

De variabelen die een methode kan gebruiken zijn:

  • self.var1 : var1 is hier een variabele van het exemplaar van deze class, specifiek voor dit object (instance variable).
  • var2 : een lokale variabele die binnen de methode is gemaakt.
  • MijnClass.var3 : een class variabele, ook wel statische variabele genoemd, dus niet specifiek voor het object, maar voor de class.
  • var4 : een globale variabele, in de hele module bereikbaar.

Class methods

Methods die geen betrekking hebben op een instance van een class maar op de class zelf worden class methods genoemd en worden aangegeven met een decorator: @classmethod. In plaats van self wordt her cls meegegeven.


@classmethod
def doe_iets(cls, var1)
    cls.var = var1

Static methods

Static methods zijn methoden die ook buiten de class kunnen bestaan, ze hebben geen betrekking op de class en gebruiken geen attributen van de class. Hier kan de decorator @staticmethod voor worden gebruikt.


@staticmethod
def voeg_haakjes_toe(var): # geen 'self' hier
    return '(' + str(var) + ')'

Subclasses

Een subclass is een class op basis van een andere class. Deze nieuwe class erft alle attributen (variabelen en methoden) van de oorspronkelijke class. Deze attributen kunnen dan aangepast worden. Ook kunnen er nieuwe attributen worden toegevoegd die de oorspronkelijke class niet heeft.

De originele class wordt base class of super class genoemd. Er kunnen meerdere generaties class zijn via welke ge-erfd wordt. Class C erft bijvoorbeeld van class B, die weer erft van class A. De ultieme base class is 'object'.

De __new__() en __init__() methoden

De __new__() en __init__() methoden zijn nodig om een nieuw object te maken. De __new__() methode hoef je zelden opnieuw te maken in een class, de ge-erfde versie van de super class volstaat. De __init__() methode is nodig voor het intialiseren van het object. De __init__() methode wordt in andere programmeertalen de constructor genoemd.

Voorbeeld:


def __init__(self, x, y):
    self.x = x
    self.y = y

Vaak wordt in de __init__() van een class ook de super().__init__() aangeroepen, dit is vaak overbodig, je mag het echter altijd gebruiken. Als je een class maakt met de bedoeling om daar weer subclasses mee te maken, dan is het wel handig om super().__init__() als eerste regel in de __init__() van je class op te nemen om oneindige recursie te voorkomen.Het effect van het aanroepen van super().__init__() is het aanroepen van de __init__() van de base class.

De __repr__() en __str__() methoden

Als __str__() niet gedefinieerd is, wordt __repr__() gebruikt. De __str__() methode wordt gebruikt bij een print opdracht van een object.

De __repr__() moet je eigenlijk altijd implementeren, deze wordt gebruikt als je de naam van het object intypt op een Python-console en daarna Enter drukt.

De __str__() methode kan je definiëren om een gebruikersvriendelijke versie van het object te tonen.

De __repr__() methode is bedoeld als de 'formele' weergave van een object en de __str__() methode is bedoeld als de 'informele' weergave van een object.

Een methode op een variabele laten lijken met @property

Als je een methode vooraf laat gaan door een regel met @property, dan gebruik je de ingebouwde property() decorator functie om een 'getter' te maken. In plaats van:


x = mijnobject.kwadraat()

gebruik je dan:


x = mijnobject.kwadraat

voor de methode kwadraat van mijnObject.

Als je alleen een getter maakt, dan is mijnObject.kwadraat alleen lezen (read-only).

Stel de methode kwadraat mag alleen waarden krijgen kleiner als 10, dan kun je een setter definiëren met een assert:


@kwadraat.setter
def kwadraat(self, x):
    assert x < 10, "x moet kleiner zijn als 10"
    self.__x = x

Hier gebruik je de naam van de methode dus nogmaals, maar de decorator zorgt ervoor dat dit geen probleem is en er geen naamconflicten optreden.

Bij het gebruik van de @property decorator kan je een getter, een setter, een deleter en een docstring instellen.

Is iets een exemplaar van?

Controleren of een class een subclass is van een andere class kan met issubclass:


print(issubclass(deze_class, andere_class))

Controleren of een object een instance is van een class kan met isinstance:


print(isinstance(een_object, mijn_class))

 

Verwante artikelen