Variable statique

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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

Édité par john.doe

+1 -0
Staff

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.

Édité par nohar

I was a llama before it was cool

+1 -0

Si tu insistes sur ce comportement, voici un exemple

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Test:
    variable = 0

    def __init__(self):
        self.variable = 0

    def __setattr__(self, name, value):
        if name == 'variable':
            Test.variable = value
        self.__dict__[name] = value

Bonne continuation

+0 -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).

Édité par yoch

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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