重複の可能性:
Pythonのインスタンス変数とクラス変数
これら2つの状況の違いは何ですか?Pythonではどのように扱われますか?
Ex1
class MyClass:
anArray = {}
Ex2
class MyClass:
__init__(self):
self.anArray = {}
最初の例では、配列が静的変数のように扱われているようです。Pythonはこれをどのように扱い、その理由は何ですか?
重複の可能性:
Pythonのインスタンス変数とクラス変数
これら2つの状況の違いは何ですか?Pythonではどのように扱われますか?
Ex1
class MyClass:
anArray = {}
Ex2
class MyClass:
__init__(self):
self.anArray = {}
最初の例では、配列が静的変数のように扱われているようです。Pythonはこれをどのように扱い、その理由は何ですか?
最初の例ではanArray
(Pythonでは配列ではなく辞書と呼ばれます)はクラス属性です。を使用してアクセスできますMyClass.anArray
。クラスが定義されるとすぐに存在します。
2番目の例でanArray
は、はインスタンス属性です。を使用してアクセスできますMyClass().anArray
。(ただし、これを行うと、MyClass
作成されたインスタンスが破棄されることに注意してください。より適切な例はmc = MyClass(); mc.anArray['a'] = 5
です。)クラスのインスタンスが作成されるまで存在しません。
異なるエリアとして宣言されています。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)