Variable statique

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Les variables de classe sont sensées être statiques et de ce fait identiques à tous les objets instanciés. Lorsque je modifie la variable statique via un objet, elle est sensé être identique partout ! Pourtant ci-dessous, ce n'est pas le cas. Peut-on m'expliquer pourquoi ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Test:
    variable = 0

t = Test()

print(Test.variable) # Retourne 0
print(t.variable)    # Retourne 0

t.variable = 1

print(Test.variable) # Retourne 0
print(t.variable)    # Retourne 1

Test.variable = 5

print(Test.variable) # Retourne 5
print(t.variable)    # Retourne 1
+1 -0

Salut.

Lorsque tu accèdes à t.variable, il va d'abord regarder si l'instance a un attribut de ce nom, et s'il ne le trouve pas, il va regarder si sa classe en a un, (avant de poursuivre en regardant dans la classe mère, etc.).

Lorsque tu écris t.variable = 1, tu affectes 1 à un nouvel attribut d'instance et non de classe. En gros, tu modifies (crées, en l'occurrence) l'attribut variable de l'insance t et non de la classe Test.

Bref, t.variable ne va chercher un attribut de classe que lorsque tu y accèdes en lecture. En gros il faut bien faire attention au namespace que tu utilises. Le meilleur moyen, c'est d'éviter d'aller trifouiller les attributs de classe d'un objet directement, et de passer plutôt par des méthodes de classe.

+1 -0

Il est plus logique de faire Test.variable = value directement dans le code.

Je ne vois aucune raison plausible de passer par une instance pour modifier un attribut de classe (même si on ne connait pas la classe, on peut toujours faire obj.__class__.variable = value ou type(obj).variable = value).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte