web-dev-qa-db-ja.com

インスタンスメソッド内のクラス変数の更新

class MyClass:
    var1 = 1

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

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

a = MyClass(1)

メソッド内でクラス変数(var1)を更新しようとしています(_init_ =)しかし、私は私にくれます:

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

これは、print MyClass.var1を呼び出してクラス内のすべての変数に簡単にアクセスできるようにするためです。

15
f.rodrigues

classesinstancesを混同しています。

class MyClass(object):
    pass

a = MyClass()

MyClassはクラス、aはそのクラスのインスタンスです。ここでのエラーは、updateインスタンスメソッドであることです。 __init__から呼び出すには、次のいずれかを使用します。

self.update(value)

または

MyClass.update(self, value)

または、updateクラスメソッドにします。

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

@classmethodデコレータを使用する必要があります:

$ 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