3

クラス共有変数は、私の知る限り、クラスのすべてのインスタンスと共有されています。しかし、私はこれを理解するのに苦労しています。

class c():
    a=[1]
    b=1
    def __init__(self):
        pass

x=c()
x.a.append(1)
x.b+=1 #or x.b=2

print x.a #[1,1]
print x.b #2

y=c()
print y.a #[1,1] :As Expected
print y.b #1 :why not 2?

yaはxaと共鳴しますが、 ybは共鳴しません。

誰かが明確にしてくれることを願っています。

編集:そして、intに対して同じ機能をどのように作成できますか。

4

2 に答える 2

10
x.a.append(1)

リストをその場で変更するメソッドを呼び出すことにより、クラス属性c.aaを変更します。listappend

x.b += 1

実際にはの省略形です

x.b = x.b + 1

Python の整数は不変であるため、__iadd__(インプレース加算) メソッドがありません。この代入の結果は、値(代入の右辺を評価した結果)を使用bして、インスタンスに属性を設定することです。この新しいインスタンス属性は、クラス属性を隠します。x2

インプレース操作と割り当ての違いを確認するには、次を試してください。

x.a += [1]

x.a = x.a + [1]

これらは異なる動作をします。

編集整数をボックス化することで、同じ機能を得ることができます。

class HasABoxedInt(object):
    boxed_int = [0]    # int boxed in a singleton list

a = HasABoxedInt()
a.boxed_int[0] += 1
b = HasABoxedInt()
print(b.boxed_int[0])  # prints 1, not zero

また

class BoxedInt(object):
    def __init__(self, value):
        self.value = value
    def __iadd__(self, i):
        self.value += i
于 2013-08-24T15:27:07.880 に答える