2012-02-22 12 views
3

私はここで何が起こっているか理解できないようです。不可解な範囲の行動

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のスコープのように見えますが、クラスのインスタンス化をtrascendsします。 私はこれが非常に不安定で困惑していると思いますが、ここで何か不足していますか?

ありがとうございます!

答えて

6

myListの定義方法はクラス属性です。

あなたが探して行動がオブジェクト属性のいずれかです。

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] 

あなたはクラス属性に関心がある場合は、見てみましょうClass documentation。 Pythonのクラスはオブジェクトなので、Pythonの(ほぼ)すべてのように、独自の属性を持つことができます。

3

myListをクラス内に宣言する方法は、クラス属性になります。

class testclass: 
    def __init__(self): 
     print "new instance" 
     self.myList=[] 
1

はい、それは属性がためのものです何クラスであるため:あなたは、インスタンス属性を持っている。このようにそれを宣言することを目的とあれば、それは期待される動作を持つことになります。インスタンス変数が必要な場合は、インスタンス内で宣言する必要があります。通常、メソッド内にはselfが入ります。

0
class testclass: 

    def __init__(self): 
     self.myList=[] 
     print "new instance" 
1

myListそれはクラスの本体ではなく、オブジェクトインスタンス化時に宣言されているため、クラスインスタンス生成時に初期化されます。同じ名前を持つ変数がインスタンス上に作成されるまで

このような特性は、次に、インスタンスと共有されています。

だから、あなたのケースでは、あなたは同じmyListオブジェクトにアクセス(およびそれに値を追加)するために、各オブジェクトを使用しています。

0

myListをインスタンス変数にしたい場合は、init関数内でself.myListを定義する必要があります。それからあなたは期待している行動を取るべきです。今のところ、myListはクラス変数で、クラスのすべてのインスタンスで共有されると思います。

+1

オブジェクトの割り当てが完了するまでのみ共有されます。 – Marcin

+0

あなたのご意見が分かりません。クラス変数は常にすべてのインスタンスで共有されていませんか? myListがクラス変数とインスタンス変数の両方として定義されていても、それらは依然として別個であり、一方の割り当ては他方には影響しません。何か不足していますか? – Pierce

+0

それは私の要点です。インスタンスの変数に代入すると、そのインスタンスを使用してクラス変数にアクセスすることはできなくなります(インスタンス変数を削除しない限り)。 – Marcin

関連する問題