class C:
count=0
a=C()
b=C()
c=C()
print(a.count)
print(b.count)
print(c.count)
c.count+=10
print(c.count)
print(a.count)
print(b.count)
print(C.count)
C.count+=100
print(a.count)
print(b.count)
print(c.count)
0
0
0
10
0
0
0
100
100
10
为什么后来a.count b.count的值都是100 而c.count的值是10
ringa_lee2017-04-18 10:25:43
クラス属性は Java の静的変数に相当し、クラスに属します。
ここで c のインスタンス属性を c.count+=10 と定義しているためです。
つまり、print(c.count) は 10 です
伊谢尔伦2017-04-18 10:25:43
c.count+=10 は、インスタンスオブジェクト c にインスタンス属性を動的に追加することと同等であるため、c.count を出力すると、クラス属性の代わりにインスタンス属性が出力されます
リーリー巴扎黑2017-04-18 10:25:43
段階的に見ることができます。
まず 3 つの C クラス オブジェクトをインスタンス化します。
a、b、cのカウント値を出力します。
これには属性の検索順序が関係します。
まず、インスタンスにカウント値があるかどうかを確認し、見つからない場合は上位レベルを検索します。インスタンスの上位がクラスになります。class属性にcountがある場合は、ここのcountが出力されます。
c.count += 10
元々、c.count は C.count を参照しますが、それに新しい値を割り当てることは、count 属性を持つ c インスタンスと同等になります。
a、b、c、Cのカウント値を出力します。この時点で、インスタンス c はすでに独自のカウント値を持っています。
C.count += 100
クラスCのカウント値を変更します。 c には独自のカウント値があり、a と b は引き続き C のカウント値を参照します。
たぶんそんな感じです。
PHP中文网2017-04-18 10:25:43
一言で言えば、インスタンスがクラスの静的変数に値を割り当てるとき、静的属性がインスタンスの属性と競合する場合、その順序は実際には動的にインスタンスに追加されます。インスタンスへのアクセスが優先される: インスタンス》クラス
https://segmentfault.com/a/11...