質問

ここで何が起こっているのか理解できないようです:

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はクラス変数であり、クラスのすべてのインスタンスで共有されると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top