web2 logo

Classes in Python

Met een class kan je een eigen datatype maken die aan je eigen regels voldoet.
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 2 underscores, bijvoorbeeld: __add__() en __len__(). 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.

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.
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 meken, 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 inypt 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.

Toegevoegd door: Kees de Keijzer
Twitter: @kdkq

~ python ~

~ Onderwerpen ~

Dit is een website zonder pop-ups

~ Links ~

Design & Development by Cyberwebdesign.nl for web2.nl © 2020.