Python-objecten en klassen: een praktische gids
Python-objecten en klassen
Deze tutorial verkent Python's kern object-georiënteerde features, en begeleidt je door klassecreatie, instantiatie en best practices voor robuuste code.
Video: Python-klassen en objecten
Python-objecten en klassen
Python is fundamenteel object-georiënteerd. Waar procedureel programmeren zich richt op functies, centreert OOP op objecten die data en gedrag bundelen.
Een object is een bundel van attributen (data) en methoden (functies). Een klasse is de blauwdruk die de structuur van een object definieert.
Denk aan een klasse als een huisblauwdruk – detaillering kamers, deuren, ramen. Elk gebouwd huis is een object, of instantie, gecreëerd vanuit die blauwdruk.
Meerdere objecten kunnen gebouwd worden vanuit dezelfde klasse. Instantiatie is het proces van een object aanmaken uit een klasse.
Een klasse definiëren in Python
Klassedefinities beginnen met het class-trefwoord, gespiegeld hoe functies beginnen met def. De eerste string in een klasse is de docstring, die een beknopte beschrijving geeft.
class MijnNieuweKlasse:
'''Dit is een docstring. Ik heb een nieuwe klasse gemaakt'''
pass
Een klasse definiëren vestigt een nieuwe naamruimte voor zijn attributen, die data of methoden kunnen zijn. Speciale attributen beginnend met dubbele underscores, zoals __doc__, bevatten metadata zoals de docstring.
Eenmaal gedefinieerd, wordt een klasse-object aangemaakt en kan gebruikt worden om attributen te benaderen of nieuwe objecten te instantiëren.
class Persoon:
"Dit is een persoon-klasse"
leeftijd = 10
def groet(self):
print('Hallo')
# Uitvoer: 10
print(Persoon.leeftijd)
# Uitvoer: <function Persoon.greet>
print(Persoon.greet)
# Uitvoer: "Dit is een persoon-klasse"
print(Persoon.__doc__)
Uitvoer
10 <function Persoon.greet at 0x7fc78c6e8160> Dit is een persoon-klasse
Een object aanmaken in Python
Klassen dienen als fabrieken voor objecten. Instantiatie lijkt op een functie-aanroep:
>>> harry = Persoon()
Het resulterende object harry kan klasse-attributen benaderen via dot-notatie. Klassenmethoden worden bound methods op de instantie.
class Persoon:
"Dit is een persoon-klasse"
leeftijd = 10
def groet(self):
print('Hallo')
# maak een nieuw object van Persoon-klasse
harry = Persoon()
# Uitvoer: <function Persoon.greet>
print(Persoon.greet)
# Uitvoer: <bound method Persoon.greet of <__main__.Persoon object>>
print(harry.greet)
# Roep object's groet() methode aan
# Uitvoer: Hallo
harry.greet()
Uitvoer
<function Persoon.greet at 0x7fd288e4e160> <bound method Persoon.greet of <__main__.Persoon object at 0x7fd288e9fa30>> Hallo
Let op de self-parameter in methodedefinities. Wanneer een methode op een instantie wordt aangeroepen, geeft Python de instantie automatisch als eerste argument door, wat harry.groet() in staat stelt uit te voeren zonder expliciet self te geven.
Volgens conventie wordt self gebruikt, hoewel elke naam syntactisch geldig is. Deze conventie volgen verbetert leesbaarheid en past bij community-standaarden.
Constructors in Python
Speciale methoden met dubbele underscores voeren speciale rollen uit. De __init__-methode, aangeroepen bij instantiatie, fungeert als constructor en initialiseert de instantie-staat.
class ComplexGetal:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# Maak een nieuw ComplexGetal-object
num1 = ComplexGetal(2, 3)
# Roep get_data() methode aan
# Uitvoer: 2+3j
num1.get_data()
# Maak een ander ComplexGetal-object
# en voeg een dynamisch attribuut 'attr' toe
num2 = ComplexGetal(5)
num2.attr = 10
# Uitvoer: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# Benaderen van ontbrekend attribuut geeft fout
print(num1.attr)
Uitvoer
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'ComplexGetal' object has no attribute 'attr'
Dit voorbeeld demonstreert dat attributen dynamisch aan individuele instanties toegevoegd kunnen worden zonder andere te beïnvloeden.
Attributen en objecten verwijderen
Attributen kunnen verwijderd worden met het del-statement. Het verwijderen van de klassenmethode of het attribuut beïnvloedt volgende aanroepen.
>>> num1 = ComplexGetal(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexGetal' object has no attribute 'imag'
>>> del ComplexGetal.get_data
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexGetal' object has no attribute 'get_data'
Objecten zelf kunnen verwijderd worden. Het verwijderen van de referentie vrijwaart de naam; als geen andere referenties bestaan, wordt het object automatisch garbage-collected.
>>> c1 = ComplexGetal(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
... NameError: name 'c1' is not defined
In Python wordt geheugenbeheer afgehandeld door reference counting en een cyclische garbage collector, wat efficiënte resource cleanup garandeert.

Python
- C# Classes & Objects: Fundamenten voor Robuuste OOP
- C# Abstract Classes & Methods: Een Praktische Gids
- C# Partial Classes en Methods: Een Praktische Gids
- C# Sealed Classes en Methods: Wanneer en Hoe Te Gebruiken
- C++ klassen & objecten: praktische gids voor object-georiënteerd programmeren
- C++ Friend Functies en Friend Classes: Toegangscontrole Beheersen
- Python Keywords en Identifiers: Gereserveerde woorden en naamconventies onder de knie krijgen
- Python Statements, Indentatie en Comments: Een duidelijke gids
- Python-directory en bestandsbewerkingen beheersen
- Python-custom exceptions: een praktische gids
- Python-erfelijkheid beheersen: concepten, syntax en praktische voorbeelden