f.rodrigues
f.rodrigues

Reputation: 3587

Updating Class variable within a instance method

class MyClass:
    var1 = 1

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

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

a = MyClass(1)

I'm trying to update a class variable(var1) within a method(_init_) but I gives me:

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

I'm doing this because I want easy access to all variables in a class by calling print MyClass.var1

Upvotes: 25

Views: 85667

Answers (2)

jonrsharpe
jonrsharpe

Reputation: 122007

You are confusing classes and instances.

class MyClass(object):
    pass

a = MyClass()

MyClass is a class, a is an instance of that class. Your error here is that update is an instance method. To call it from __init__, use either:

self.update(value)

or

MyClass.update(self, value)

Alternatively, make update a class method:

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

Upvotes: 30

damienfrancois
damienfrancois

Reputation: 59090

You need to use the @classmethod decorator:

$ 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

Upvotes: 13

Related Questions