2016-08-11 4 views
-1

私はJavaからPythonに移行しています。 Javaでは、静的変数は同じクラスの別のオブジェクトによって変更されても、クラスのすべてのオブジェクトに同じ値を返します。私が読んでいるPythonの本では、データメンバは、クラス定義の直接のスコープ内で代入が行われる場合、クラスの名前空間に入力されます。Javaでのように、このコードがクラス変数を使用していないのはなぜですか?

私はIDLE、Pythonのインタプリタを使用して、以下のPythonコードですよ:

class ABC: 
    OVRLIMIT_FEE=5 

>>> a=ABC() 
>>> b=ABC() 

>>> a.OVRLIMIT_FEE+=1 
>>> a.OVRLIMIT_FEE 
6 
>>> b.OVRLIMIT_FEE 
5 

しかし、それは、クラスの名前空間を入力した場合、それがAの両方でアクセスされたとき、それは同じ値を返すべきではないとb?

+0

は、Javaを述べていますが、この質問は、それとは全く関係のない – SomeJavaGuy

+1

あなたは、オブジェクトを変更しているされたABCの属性がない属性、 'ABC.OVRLIMIT_FEE + = 1 'あなたが得るでしょうか6両方とも – dnit13

+0

'a.OVRLIMIT_FEE'(' a.OVRLIMIT_FEE + = 1'で行ったように)に割り当てると、 'a'にインスタンス変数を作成しています。クラス変数にアクセスしたい場合は、 'ABC.OVRLIMIT_FEE'を使います。 – khelwood

答えて

0

あなたの(正しく)予想される動作をサポートしていない、いわゆるOldstyleクラスを作成したとします。 objectから継承して、新しいスタイルのクラスを作成します。期待どおり、それは動作します[...]

a.foo += 1を使用すると、a.foo = a.foo + 1として暗黙的にunterstoodで、

  • は、クラスのプロパティfooの
  • をとる1
  • を追加するインスタンスに結果を置きますプロパティfoo。

コード:

>>> class B(object): 
... x=5 
>>> b1=B() 
>>> b2=B() 
>>> b1.x += 1 
>>> b1.__dict__ 
{'x': 6} 
>>> b2.__dict__ 
{} 
>>> B.__dict__ 
{'x': 5 ... and other stuff ... } 
+0

b2.xはクラスBのxが6なので6を出力します。期待どおりに動作するならば、7を出力しないのですか? –

+0

ああ、私は昼休みのpythonの質問に答えるべきではありません。私はすぐに答えを修正します。 –

関連する問題