私はクラスを持っている:Pythonのクラスの静的メンバ:インスタンスを経由してアクセス
class A:
x = 12
静的メンバにこれら2つのアクセスのフォームの違いは何ですか?:
a = A()
print(a.x) # >> 12
print(a.__class__.x) # >> 12
私はクラスを持っている:Pythonのクラスの静的メンバ:インスタンスを経由してアクセス
class A:
x = 12
静的メンバにこれら2つのアクセスのフォームの違いは何ですか?:
a = A()
print(a.x) # >> 12
print(a.__class__.x) # >> 12
時に違いはありません価値を得る。 a.x
はA.x
(これはa.__class__.x
と同じです)に戻ります。
ただし、値を設定しようとすると、a.x = 13
は新しいインスタンス変数を設定します。A.x
は元の値になります。その後、a.x
は、常にクラス1ではないインスタンス値を見つけるでしょう。
違いはなく、同じです。これは、python がどのように属性を検索するかに関係しています。それは等々クラス属性で検索し、それを見つけることができなかった場合
それはまず、インスタンス属性を調べます。
2番目の文(a.__class__.x
)では、明示的にpythonにクラスdictを直視させ、インスタンスの参照をスキップします。
ここで、a.x
は、クラスのインスタンスの変数値(クラスオブジェクトに限定されたスコープ)を返しますが、A.x
は、クラス変数の値を返します。あなたは好きなことを確認することがあります。
# create object of class A()
>>> a = A()
>>> b = A()
# same value
>>> A.x
12
>>> a.x
12
# updated a.x
>>> a.x = 5
>>> A.x # still old value
12
>>> a.x # new value
5
>>> b.x # old value
12
# updated A.x
>>> A.x = 9 # new value
>>> A.x
9
>>> a.x # old value
5
>>> b.x # new value
9
結論:あなたは、クラスのインスタンスの値を更新した場合、変更はそのインスタンスに制限されます。ただし、クラス変数の値を変更すると、インスタンスが値を明示的にオーバーライドしていない場合は、変更がすべてのインスタンスに反映されます。
この場合はありませんが、インスタンスに直接代入することでクラス - ネームスペースをシャドウできます。 –