2012-05-01 19 views
1

可能性の重複:
Instance variables vs. class variables in PythonPython ...静的変数?

これら二つの状況とそれがどのようにPythonでで処理されたとの違いは何ですか?

Ex1の

class MyClass: 
    anArray = {} 

Ex2の

class MyClass: 
    __init__(self): 
      self.anArray = {} 

これは最初の例では、アレイは、静的変数のように扱われているように思えます。 Pythonはこれをどのように扱いますか?その理由は何ですか?

+0

"静的変数"ではありませんが、 "安定した名前"を持つ*特定のオブジェクト*のメンバーです。それはどのオブジェクトでしょうか? ;-)(クラスはPythonの「単なる定義」ではないことを覚えておいてください) –

+0

これらはクラス変数と呼ばれています。 http://stackoverflow.com/questions/2714573/instance-variables-vs-class-variables-in-pythonまたはhttp://stackoverflow.com/questions/68645/static-class-variables-in-python – birryree

答えて

5

最初の例では、anArray(これはPythonでは辞書と呼ばれ、配列ではありません)はクラス属性です。 MyClass.anArrayを使用してアクセスできます。クラスが定義されるとすぐに存在します。

第2の例では、anArrayがインスタンス属性です。 MyClass().anArrayを使用してアクセスできます。 (ただし、作成するとMyClassインスタンスがスローされてしまいますが、より賢明な例はmc = MyClass(); mc.anArray['a'] = 5です)。クラスのインスタンスが作成されるまで存在しません。

0

異なる領域が宣言されています。 Ex1はグローバル変数または静的変数と似ています。

obj = MyClass() 
obj2 = MyClass() 
print "IS one instance ", id(obj.anArray) == id(obj2.anArray) 

Ex2はローカル属性です。

obj = MyClass() 
obj2 = MyClass() 
print "IS one instance ", id(obj.anArray) == id(obj2.anArray) 
+1

私は思いますクラス属性とインスタンス属性がより適切な用語です。あなたは、彼らは全く同じだとして、コードのこれらのビットを示そうとしているもの – jdi

+0

イムわかりません。.. – Joost