2.20. Première classe¶
Une classe regroupe sous un seul nom des données et les fonctions qui agissent sur ces données. Y avoir recours est avantageux lorsque plusieurs éléments d’état vont de pair et que la plupart des fonctions d’un script prennent ce même ensemble de valeurs comme arguments.
2.20.1. Le mot-clé class¶
Le mot-clé est class. Le corps contient une méthode __init__ qui s’exécute chaque fois qu’une nouvelle instance est créée :
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Sortie
3 4
Point est la classe ; p en est une instance. Les parenthèses dans l’appel Point(3, 4) invoquent __init__, qui affecte les arguments à des attributs de la nouvelle instance. self est le nom conventionnel de l’instance ; self.x définit un attribut que les autres méthodes de l’instance liront.
2.20.2. Quand utiliser une classe¶
Ayez recours à une classe lorsque ces conditions sont vraies en même temps :
Une poignée de valeurs liées voyagent ensemble partout (les
xetyd’un point ; la valeur, l’unité et l’horodatage d’une lecture de capteur).Plusieurs fonctions prennent ce même ensemble de valeurs et opèrent dessus.
Il est utile de maintenir plusieurs de ces ensembles actifs en même temps, distincts les uns des autres.
Si les données sont ponctuelles, un simple dict ou tuple suffit généralement. Si vous n’avez besoin que d’un seul ensemble de constantes, des variables au niveau du module conviennent. Les classes ne sont pas le conteneur par défaut – elles gagnent leur place lorsque l’état et le comportement veulent rester ensemble.
2.20.3. Ce que fait __init__¶
__init__ n’est qu’une méthode ordinaire. Tout ce qui est affecté à self à l’intérieur devient un attribut de la nouvelle 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)
Sortie
temperature C []
readings est initialisé à une liste vide – chaque nouvelle instance reçoit sa propre liste, et non une liste partagée. Tout ce qui n’est pas affecté à self est local à __init__ et disparaît au retour de celle-ci.