2016-12-02 4 views
1

に異なる値を持つクラス変数は、異なるインスタンス私は</p> <p>例えば「Pythonがインスタンス変数を見つけることができない場合、それは同じ名前を持つクラス変数の値を返すようにしようとする」ことをどこかで読ん

class Sample: 
    pi = 10 

今すぐ

x1 = Sample() 
x2 = Sample() 

x1.pi   # returns 10 
x2.pi   # returns 10 

x1.pi = 20 # change the value of class variable 
x1.pi   # return 20 (OK) 
x2.pi   # still returns 10 :(
Sample.pi  # returns 10 :(

何が起こっていますか?

+4

あなたのクラスには 'pi'も定義されていません – lmiguelvargasf

+0

typel @ lmiguelvargasfについてはごめん、投稿を編集しました –

答えて

2

インスタンスの名前に割り当てるとすぐに、クラス属性をシャドウするインスタンス属性が取得されます。

クラス属性に割り当てることができる唯一の方法は、インスタンスの属性ではなくクラスの属性に割り当てることです。あなたは、インスタンスを持っている場合、あなたは何をする必要があります。

x1.__class__.pi = 20 
# If you're on Py3, or on Py2 and x1 is an instance of a new-style class, 
# using type(x1) is slightly "nicer" than manually accessing dunder special 
# variables, but unfortunately, it doesn't work on old-style class instances 
# For new-style class instances though, the following is equivalent: 
type(x1).pi = 20 

あなたはx1と同じタイプのすべてのインスタンスが変更を表示したい場合。これにより、クラス自体が__class__(またはtype関数)から取得され、それに割り当てられます。

誤っ属性と再びクラス属性を公開するインスタンスを作成した場合、あなたが行うことができます:

pi名前付きインスタンスの属性が存在する場合は成功します
del x1.pi 

、およびraise AttributeErrorそうでない場合には(それクラス属性が存在する場合は削除しませんが、それを行うにはdel x1.__class__.pi/del type(x1).piを実行する必要があります)。

+0

注:この回答はclass属性の名前が実際に' pi'であると仮定しています。あなたの例は 'x'という名前をつけて、' pi'にアクセスします。 – ShadowRanger

関連する問題