Vous connaissez déjà les données attributs, qui
sont des variables appartenant à une instance particulière d'une
classe. Python permet aussi les attributs
de classe, qui sont des variables appartenant à la classe
elle-même.
Exemple 5.17. Présentation des attributs de classe
>>> import fileinfo>>> fileinfo.MP3FileInfo<class fileinfo.MP3FileInfo at 01257FDC>>>> fileinfo.MP3FileInfo.tagDataMap{'title': (3, 33, <function stripnulls at 0260C8D4>),
'genre': (127, 128, <built-in function ord>),
'artist': (33, 63, <function stripnulls at 0260C8D4>),
'year': (93, 97, <function stripnulls at 0260C8D4>),
'comment': (97, 126, <function stripnulls at 0260C8D4>),
'album': (63, 93, <function stripnulls at 0260C8D4>)}>>> m = fileinfo.MP3FileInfo()>>> m.tagDataMap{'title': (3, 33, <function stripnulls at 0260C8D4>),
'genre': (127, 128, <built-in function ord>),
'artist': (33, 63, <function stripnulls at 0260C8D4>),
'year': (93, 97, <function stripnulls at 0260C8D4>),
'comment': (97, 126, <function stripnulls at 0260C8D4>),
'album': (63, 93, <function stripnulls at 0260C8D4>)}
MP3FileInfo est la classe elle-même,
pas une instance particulière de cette classe.
tagDataMap est un attribut de classe :
littéralement, un attribut de la classe. Il est diponible avant
qu'aucune instance de la classe n'ait été créée.
Les attributs de classe sont disponibles à la fois par
référence directe à la classe et par référence à une instance
quelconque de la classe.
En Java, les variables statiques
(appelées attributs de classe en Python)
aussi bien que les variables d'instance (appelées données attributs en
Python) sont définies immédiatement après
la définition de la classe (avec le mot-clé static
pour les premières). En Python, seuls les
attributs de classe peuvent être définis à cet endroit, les données
attributs sont définies dans la méthode
__init__.
Les attributs de classe peuvent être utilisés comme des constantes
au niveau de la classe (ce qui est la manière dont nous les utilisons
dans MP3FileInfo), mais ils ne sont pas vraiment
des constantes. Vous pouvez également les modifier.
Il n'y a pas de constantes en
Python. Tout est modifiable en faisant
un effort. C'est en accord avec un des principes essentiels de
Python : un mauvais comportement doit
être découragé mais pas interdit. Si vous voulez vraiment changer la
valeur de None, vous pouvez le faire, mais ne
venez pas vous plaindre que votre code est impossible à
déboguer.
Exemple 5.18. Modification des attributs de classe
>>> class counter:... count = 0... def __init__(self):... self.__class__.count += 1... >>> counter<class __main__.counter at 010EAECC>>>> counter.count0>>> c = counter()>>> c.count1>>> counter.count1>>> d = counter()>>> d.count2>>> c.count2>>> counter.count2
count est un attribut de la classe
counter.
__class__ est un attribut prédéfini de
toute instance de classe (de toute classe). C'est une référence à
la classe dont self est une instance (dans ce
cas, la classe counter).
Comme count est un attribut de classe, il
est disponible par référence directe à la classe, avant que nous
ayions créé une instance de la classe.
Créer une instance de la classe appelle la méthode
__init__, qui incrémente l'attribut de classe
count de 1. Cela affecte
la classe elle-même, pas seulement l'instance nouvellement
créée.
Créer une seconde instance incrémente à nouveau l'attribut
de classe count. Vous constatez que l'attribut
de classe est partagé par la classe et toutes ses
instances.