Python et les objets statiques
Les variables statiques
En C/C++, il est l’usage d’avoir des variables statiques, c’est-à-dire non-dynamiques, pour le
comptage d’objets ou pour des flags en code embarqué, ou l’on évite comme la peste les new et
delete. C’est intégré au langage, avec le mot clef ‘static’, au cas où la définition globale - hors des
accolades - n’y suffit pas. Une variable statique est aussi privée au module, afin de réduire sa
visibilité.
Déclarer une variable static revient à lui donner une adresse mémoire définitive. Au niveau du
module, on le comprend aisément. C’est plus surprenant dans une fonction : on la retrouve
inchangée depuis le dernier appel – a moins bien sûr que la fonction en question ne la modifie ! Cette
persistance est valable même si elle est déclarée à l’intérieur d’un objet alloué dynamiquement. Mais
en Python, comment reproduire ce comportement ?
Petite digression : dans ce texte, j’utilise souvent le mot fonction par habitude, alors que la
terminologie Python est : method.
A priori, « static » va l’encontre de la programmation orientée objet… Mais parfois, on aimerait un
objet unique, a dispo de manière globale, déclaré et initialisé au niveau du module. Il serait ‘objet’
pour la beauté de la pensée, donc de la programmation, plutôt qu’un fatras de variables globales ;
même si elles sont utilisées au niveau du module. Cet objet serai statique parce que l’instancier ne
fait que de compliquer le code, voire de prendre le risque de dédoubler l’objet par mégarde alors
qu’il doit être unique.
C’est un peu tordu : si un objet n’est pas instancié… il doit être un peu instancié quand même,
puisque par définition, une variable statique doit exister au moment où le programme tourne. Les
exemples de codes sont entrés au niveau de la console Python ; ici en version 2.7.2, dans
l’environnement (gratuit) PyCharm Community : http://www.jetbrains.com/pycharm/
Variable de classe statique
Bien. Mais comment, en Python, reproduire ce qu’on sait si bien faire en C/C++ ?
Python permet la définition de variables statiques tout court si, hors d’une classe, définie au niveau
du module; et dans un objet, si défini hors des fonctions de la classe. On s’intéresse à cette
possibilité. Dans un tel cas, elle est accédée par le nom de la classe.
A priori, ça fonctionne fort bien ! En utilisant la classe de base, soit Toto - avec la majuscule qui
symbolise la déclaration de classe - la variable ‘a’ d’instance est accessible et modifiable. C’est
pratique, et on peut toujours instancier la classe normalement, p. exemple dans la variable x :