質問
ここで何が起こっているのか理解できないようです:
class testclass:
def __init__(self):
print "new instance"
myList=[]
if __name__ == "__main__":
inst1=testclass()
inst1.myList.append("wrong")
inst2=testclass()
inst2.myList.append("behaviour")
print "I get the",inst2.myList
出力は次のとおりです。
new instance
new instance
I get the ['wrong', 'behaviour']
リストが予想されていたでしょう Inst1 リストについては何も知りません Inst2, 、しかし、どういうわけかそれはの範囲のように見えます 私のリスト クラスのインスタンス化をトラススケンドします。私はこれが非常に不安で不可解であると思いますか、それともここで何かが足りませんか?
ありがとう!
解決
あなたが定義した方法 myList
クラス属性です。
あなたが探している動作は、オブジェクト属性の1つです。
class testclass:
def __init__(self):
print "new instance"
self.myList = []
試してみよう:
>>> t1 = testclass()
new instance
>>> t2 = testclass()
new instance
>>> t1.myList.append(1)
>>> t2.myList.append(2)
>>> t1.myList
[1]
>>> t2.myList
[2]
クラス属性に興味がある場合は、 クラスのドキュメント. 。 Pythonのクラスは、(ほぼ)すべてのPythonのようなオブジェクトであるため、独自の属性を持つことができます。
他のヒント
あなたが宣言した方法 myList
クラスの内部にはそれができます クラス 属性。あなたが持っているつもりだった場合 実例 属性、このように宣言すると、予想される動作があります。
class testclass:
def __init__(self):
print "new instance"
self.myList=[]
はい、それがクラスの属性の目的だからです。インスタンス変数が必要な場合は、インスタンス自体でそれを宣言する必要があります - 通常は self
メソッド内。
myList
で初期化されています クラス インスタンスタイムは、クラスの本体で宣言されているためではなく、 物体 インスタンス時間。
そのようなプロパティは、同じ名前の変数がインスタンスに作成されるまで、インスタンスと共有されます。
したがって、あなたの場合、あなたは各オブジェクトを使用して同じにアクセスしています myList
オブジェクト(および値を追加します)。
class testclass:
def __init__(self):
self.myList=[]
print "new instance"
mylistをインスタンス変数にしたい場合は、init関数内でself.mylistを定義する必要があります。その後、期待する動作を取得する必要があります。現在持っているように、MyListはクラス変数であり、クラスのすべてのインスタンスで共有されると思います。