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.