Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Regles De Fonctionnement Des Espaces De Nom

Concernant les attributs de classe

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...

Concernant les attributs d'instance

Les instances peuvent utiliser (mais pas modifier) les variables définies au niveau de la classe et les variables définies au niveau principal.

  • Si les variables de classes ont été modifiées après instanciation d'un objet, ce dernier en perçoit les changements :
  >>> class N:
... n=1
  ...    def __init__(self):
  ...       self.nn=2
  ... 
  >>> ex=N()
  >>> ex.n, ex.nn
  (1, 2)
  >>> N.n = 3
  >>> ex.n, ex.nn
  (3, 2)
  • Si une variable d'instance a été définie à partir d'une variable principale :
  >>> cst = 3
>>> class N:
  ...    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

Exemple condensant les divers points précédents

  >>> 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 :

  • une dans l'espace de noms de la classe (à la ligne 2),
  • une autre dans l'espace de noms principal (à la ligne 5),
  • enfin, une dernière dans l'espace de nom de l'instance (à la ligne 7).

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.

Page Actions

Recent Changes

Group & Page

Back Links