13

重複の可能性: Python Python OOP およびリスト
の静的クラス変数

これについて何か助けが得られるかどうか疑問に思っています。

私はPythonを使用していますが、私が取り組んでいる小さなプログラムでは理解できないような障害にぶつかりました。これが私の問題です(非常に単純で無関係な例を使用):クラスがあります:

class dog:
    name = ''
    friends = []

私はそれからいくつかのオブジェクトを作成します:

fido = dog()
rex = dog()

そして、ここで行き詰まります。なぜこれが起こっているのかわかりませんし、理解していません。何かについての私の理解が不足していると思いますが、どんな説明でも素晴らしいでしょう。したがって、あるオブジェクトを別のオブジェクトに追加すると、ここに私の問題があります(これは問題なく動作するはずです):

fido.friends.append(rex)

...物事が台無しになります。ここでわかるように:

>>> fido.friends.append(rex)
>>> fido.friends
[<__main__.dog instance at 0x0241BAA8>]
>>> rex.friends
[<__main__.dog instance at 0x0241BAA8>]
>>> 

それは私には意味がありません。fido.friends だけが何かを持っているべきではありませんか? 新しいオブジェクトを作成しても:

rover = dog()

その中に犬のインスタンスがあり、これが「rex」オブジェクトであることがわかります。

>>> rex.name = "rex"
>>> fido.friends[0].name
'rex'
>>> rex.friends[0].name
'rex'
>>> rover.friends[0].name
'rex'
>>> 

これでは意味がありません。助けていただければ幸いです。説明を見つけようとしてしばらく検索しましたが、見つかりませんでした。私が見逃した同様の質問があれば申し訳ありません。

4

4 に答える 4

7

それぞれの犬が独自の友達リストを持つ必要がある場合は、インスタンス属性を使用する必要があります。

class Dog(object):

    family = 'Canidae' # use class attributes for things all instances share 

    def __init__(self, name):
        """ constructor, called when a new dog is instantiated """
        self.name = name
        self.friends = []

    def __repr__(self):
        return '<Dog %s, friends: %s>' % (self.name, self.friends)

fido = Dog('fido')
rex = Dog('rex')

fido.friends.append(rex)
print(fido) # <Dog fido, friends: [<Dog rex, friends: []>]>

使用したのはクラス属性です(値はインスタンス間で共有されます)。詳細:

于 2013-01-06T01:09:48.043 に答える
3

インスタンスにアタッチされていない、クラス内で宣言された変数は、Pythonでは静的変数です。

于 2013-01-06T01:02:57.687 に答える
1

あなたがしたいことを達成するための適切な方法は、__init__メソッドの使用です:

>>> class dog:
       def __init__(self):
           self.f = []


>>> a = dog()
>>> b = dog()
>>> a.f.append(b)
>>> a.f
[<__main__.dog instance at 0x02DA6F08>]
>>> c = dog()
>>> c.f
[]
于 2013-01-06T01:07:00.137 に答える
1

これを避けるには、__init__次のように変数宣言を関数内に置きます。

class Dog:
    def __init__(self):
        self.name = ''
        self.friends = []
于 2013-01-06T01:05:52.533 に答える