25
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

2 Answers 2

30

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
Sign up to request clarification or add additional context in comments.

2 Comments

Oh I see, I thought that Class methods were those without the self in it's arguments. Thanks for the clarification.
className.var1 += 1 is what i was looking for. I was trying to do self.var1 += 1
13

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.