web-dev-qa-db-fra.com

Mise à jour de la variable de classe dans une méthode d'instance

class MyClass:
    var1 = 1

    def update(value):
        MyClass.var1 += value

    def __init__(self,value):
        self.value = value
        MyClass.update(value)

a = MyClass(1)

J'essaie de mettre à jour une variable de classe (var1) dans une méthode (_ init _ =) mais je me donne:

TypeError: unbound method update() must be called with MyClass instance as first argument (got int instance instead)

Je fais cela parce que je veux un accès facile à toutes les variables d'une classe en appelant print MyClass.var1

15
f.rodrigues

Vous confondez classes et instances.

class MyClass(object):
    pass

a = MyClass()

MyClassest une classe, a est une instance de cette classe. Votre erreur ici est que update est un méthode d'instance. Pour l'appeler depuis __init__, utilisez soit:

self.update(value)

ou

MyClass.update(self, value)

Sinon, faites update a méthode de classe:

@classmethod
def update(cls, value):
    cls.var1 += value
15
jonrsharpe

Vous devez utiliser le @classmethod décorateur:

$ cat t.py 
class MyClass:
    var1 = 1

    @classmethod
    def update(cls, value):
        cls.var1 += value

    def __init__(self,value):
        self.value = value
        self.update(value)

a = MyClass(1)
print MyClass.var1
$ python t.py 
2
3
damienfrancois