0

Pythonのクラス属性について不可解な質問があります。以下のクラスを検討してください。

class A:
    __lst = []
    def add(self, str):
        self.__lst.append(str)
        print len(self.__lst)

x と y の 2 つのインスタンスを作成しようとしたところ、次のようになりました。

>>> x = A()
>>> x.add('aaa')
1
>>> x.add('bbb')
2
>>> y = A()
>>> y.add('aaa')
3
>>> y.add('bbb')
4

y のインスタンスにはリスト属性の別のコピーがあると予想していましたが、別のオブジェクトを使用してリストに要素を追加しても、リストが大きくなるようです。それは単に奇妙です。

誰かがこの問題について私に教えてもらえますか? ご協力いただきありがとうございます。:-)

4

2 に答える 2

1

クラス本体内で属性を定義すると、それはクラス属性になり、すべてのインスタンスで共有されます。あなたのコードself.__lstでは への参照になりA.__lstます。

属性ごとに個別のリストを作成するには、関数self.__lst内で定義します。__init__()

class A(object):
    def __init__(self):
        self.__lst = []

    def add(self, s):
        self.__lst.append(s)
        print len(self.__lst)

上記の変更に加えて、コードが Python のベスト プラクティスobject( new-style classstrから継承し、 (またはその他の組み込み名) を変数名として使用しない) に従うように、いくつかのマイナーな変更も行いました。

于 2013-05-15T16:58:07.830 に答える
0

クラス内で宣言されているが、によって宣言されていない変数は、クラスselfレベルのプロパティです (あなたの のように__lst)。これらは Java のstatic. プロパティをすべてのインスタンスで一意にしたい場合は、self(つまり、self.__lst) で宣言する必要があります。

于 2013-05-15T16:59:43.377 に答える