Pour bien comprendre comment s'articulent les différents espaces de noms au-travers de la programmation objets en Python, il faut savoir qu'après l'instanciation d'un objet, on se retrouve avec trois niveaux de définition de variables :
Chaque classe possède son propre espace de noms. Les variables qui en font partie sont appelées les attributs de la classe.
>>> class toto: ... unAttributDeClasse = None
Pour y accéder, utiliser . derrière le nom de la classe concernée :
>>> toto.unAttributDeClasse = 5
Chaque instance (objet créé à partir d'une classe) obtient son propre espace de noms. Les variables qui en font partie sont appelées variables d'instance ou attributs d'instance.
>>> class Toto: ... unAttributDeClasse = 0 ... def __init__(self): ... self.unAttributDInstance = 1
Pour y accéder : instancier un objet, et utiliser le . derrière son nom :
>>> unToto = Toto()
>>> unToto.unAttributDeClasse = 5 # l'objet unToto a les
# attributs de sa classe
>>> unToto.unAttributDInstance = 44 # ainsi que les siens propres
Remarquer que sans le self dans la méthode _init_, unAttributDInstance deviendrait une variable locale à la méthode, et n'aurait aucune existance à l'extérieur de __init :
>>> class Toto:
... def __init__(self):
... pasUnAttributDInstance = 1
...
>>> unToto = Toto()
>>> unToto.pasUnAttributDInstance
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Toto instance has no attribute 'pasUnAttributDInstance'
Pour connaître les règles de fonctionnement des espaces de noms des trois niveaux de variables,
Pour des exemples illustrant cela, se rendre ici.