2016-06-01 24 views
2

私はPythonの静的変数について学んでいます。 this答えによると、コードのこの作品は、クラスのすべてのオブジェクトのためのiを一意にする必要がありますTestPythonの静的インスタンス変数

コード:

>>> class Test(object): 
...  _i = 3 
...  @property 
...  def i(self): 
...    return self._i 
...  @i.setter 
...  def i(self,val): 
...    self._i = val 
... 
>>> 
>>> x1 = Test() 
>>> x1.i 
3 
>>> x2 = Test() 
>>> x2.i 
3 
>>> x1.i = 10 
>>> x1.i 
10 
>>> x2.i 
3 

しかし、あなたは、オブジェクトx1.iを見ることができるようにすることはx2.i.と等しくありません
私はこれをPython 2.7と3.4の両方で実行しようとしましたが、結果は同じです。 このコンセプトに関する私の理解は間違っていると思います。

誰かがこれを私に説明したり、私をリソースに導いてくれますか?

+1

オブジェクトを作成します。あなたの質問は何ですか? – Selcuk

+3

そのリンクされた答えは間違っています。 'self._i = val'はクラス属性ではなく、そのインスタンス属性* _i *(これはクラスattrをシャドウします)にローカルに割り当てます。 –

+0

あなたは[this](http://stackoverflow.com/a/69067/4642859) – 3kt

答えて

1

前述のように、linked answerは間違っています。インスタンス上で見つからない場合はclassに宣言

class Test(object): 
    i = 0 


t = Test() 
t.i = 4 
print t.i 
>>> 4 
print t.__class__.i 
>>> 0 

フィールドが検索されていますが、selfから直接クラスを変更することはできません。 self.i = 4は常にインスタンスを変更します。あなたは

class Test(object): 
    _i = 0 

    @property 
    def i(self): 
     return self._i 

    @i.setter 
    def i(self, value): 
     Test._i = value 

のようなものを行うことができますが、すべての場所でクラス名を複製することは良いアイデアをいないようだとself.__class__を継承して、あまりにもうまく再生されません。これはまた、最初はiが当初クラス変数であったという事実を完全に隠しており、良い考えでもよいかもしれません。 x1.i = 10

+0

"クラスで宣言されたフィールドは自己の辞書にコピーされています"という意味は分かりませんが、正しくは聞こえません。 'i'は' t'で明示的に設定するまでインスタンスdictにはありません。むしろ、Pythonが名前を解決するときに、インスタンスレベルで見つからなければクラスレベルの属性に戻ります。 –

+0

@DanielRoseman Hmm。私は 'dir()'の魔法のために落ちたようだ。修正されました。 – dhke

0
class Test(object): 

    _i = 3 

    @property 
    def i(self): 
     return self._i 

    @i.setter 
    def i(self,val): 
     self._i = val 

if __name__ == '__main__': 

    x1 = Test() 
    x2 = Test() 

    x1.i = 10 
    print(x1.__dict__) 
    print(Test.__dict__) 

{'_i': 10} 
{'i': <property object at 0x02551180>, '__weakref__': <attribute '__weakref__' of 'Test' objects>, '_i': 3, '__module__': '__main__', '__doc__': None, '__dict__': <attribute '__dict__' of 'Test' objects>} 

は値があなたの第二文で期待どおりに彼らがユニークである

関連する問題