Les classes peuvent utiliser les variables définies au niveau principal.
>>> cst = 3.14 >>> class N: ... n = cst ... >>> n=N() >>> print N.n 3.14
Evidement, ladite variable principale doit exister :
>>> class N: ... n = Cst ... Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in N NameError: name 'Cst' is not defined
Remarquons aussi que si la variable principale change par la suite, la classe, ni ses instances, ne sont modifiés :
>>> cst = 3 >>> class N: ... n=cst ... >>> ex = N() >>> ex.n 3 >>> cst = 4 >>> ex.n 3 >>> ex2 = N() >>> ex2.n 3
Enfin, si les classes peuvent utiliser les variables principales, elles ne peuvent cependant pas les modifier :
>>> cst=3 >>> class N: ... n = cst ... def incr(self): ... self.n+=1 ... def incrCst(self): ... cst+=1 ... >>> ex=N() >>> ex.n 3 >>> ex.incr() >>> ex.n,cst (4, 3) >>> ex.incrCst() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 6, in incrCst UnboundLocalError: local variable 'cst' referenced before assignment
On peut contourner le problème en ayant recours à une variable globale () :
>>> class N: ... def incr(self): ... global cst ... cst+=1 ... >>> n=N() >>> cst 3 >>> n.incr() >>> cst 4
On pourrait remarquer que l'on n'a pas eu besoin de l'instruction global pour utiliser la variable principale cst dans la définition des variables de classe...
Les instances peuvent utiliser (mais pas modifier) les variables définies au niveau de la classe et les variables définies au niveau principal.
>>> class N:
... def __init__(self): ... self.nn=2 ... >>> ex=N() >>> ex.n, ex.nn (1, 2) >>> N.n = 3 >>> ex.n, ex.nn (3, 2)
>>> cst = 3
... def __init__(self): ... self.n = cst ...
Et si l'on modifie la variable principale, l'instance n'est pas changée :
>>> c=N() >>> c.n 3 >>> cst = 4 >>> c.n 3
>>> class Espaces: # 1 >>> aa = 33 # 2 >>> def affiche(self): # 3 >>> print aa, Espaces.aa, self.aa # 4 ... >>> aa = 12 # 5 >>> essai = Espaces() # 6 >>> essai.aa = 67 # 7 >>> essai.affiche() # 8 12 33 67 >>> print aa, Espaces.aa, essai.aa # 9 12 33 67
Dans cet exemple, le même nom aa est utilisé pour définir trois variables différentes :
La ligne 4 et la ligne 9 montrent comment accéder à ces trois espaces de noms (de l'intérieur d'une classe, ou au niveau principal), en utilisant la qualification par points.