2.20. First class¶
Een klasse groepeert gegevens en de functies die op die gegevens werken onder één enkele naam. Er een gebruiken loont wanneer verschillende stukken toestand bij elkaar horen en de meeste functies in een script diezelfde verzameling waarden als argumenten nemen.
2.20.1. Het sleutelwoord class¶
Het sleutelwoord is class. De body bevat een __init__-methode die elke keer draait wanneer een nieuwe instance wordt aangemaakt:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Uitvoer:
3 4
Point is de klasse; p is er een instance van. De haakjes op de aanroep Point(3, 4) roepen __init__ aan, die de argumenten toewijst aan attributen op de nieuwe instance. self is de conventionele naam voor de instance; self.x stelt een attribuut in dat de overige methoden van de instance zullen lezen.
2.20.2. Wanneer een klasse te gebruiken¶
Grijp naar een klasse wanneer deze tegelijkertijd waar zijn:
Een handjevol gerelateerde waarden reist overal samen (de
xenyvan een punt; de waarde, eenheid en tijdstempel van een sensormeting).Verschillende functies nemen diezelfde verzameling waarden en werken erop.
Het is nuttig om meer dan één van deze bundels tegelijk in leven te houden, onderscheiden van elkaar.
Als de gegevens eenmalig zijn, is een gewone dict of tuple meestal voldoende. Als je alleen een enkele bundel constanten nodig hebt, zijn variabelen op moduleniveau prima. Klassen zijn niet de standaardcontainer – ze verdienen hun plaats wanneer toestand en gedrag bij elkaar willen blijven.
2.20.3. Wat __init__ doet¶
__init__ is gewoon een gewone methode. Alles wat eraan self wordt toegewezen, wordt een attribuut op de nieuwe instance:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Uitvoer:
temperature C []
readings wordt geïnitialiseerd als een lege lijst – elke nieuwe instance krijgt zijn eigen lijst, niet een gedeelde. Alles wat niet aan self wordt toegewezen, is lokaal voor __init__ en verdwijnt wanneer die terugkeert.