5

コードは次のとおりです。

>>> class A(object):
...     value = []
...     def method(self, new_value):
...         self.value.append(new_value)
... 
>>> a = A()
>>> a.value
[]
>>> a.method(1)
>>> b = A()
>>> b.value
[1]
>>> b.method(2)
>>> b.value
[1, 2]
>>> a.value
[1, 2]

これはリストでのみ発生します。__init__で値を定義する唯一の方法はありますか?
Pythonでデフォルトのクラス値を通常定義する方法は?

UPD

ご回答ありがとうございます

>>> class B(object):
...     value = "str"
...     def method(self):
...         self.value += "1"
... 
>>> a = B()
>>> a.value
'str'
>>> a.method()
>>> a.value
'str1'
>>> b = B()
>>> b.value
'str'

わからない、なぜリストは共有されているのにstrは共有されていないのですか?

4

2 に答える 2

11

定義しているのvalueは、クラスのインスタンスフィールドではなく、静的フィールドのようなものです。ただし、インスタンスからこのフィールドにアクセスしても、Pythonは問題ありません。したがって、インスタンスからこのフィールドにアクセスする場合でも、インスタンスごとに異なるリストではありません。基本的に、メソッドが呼び出されるたびに同じリストに追加します。

あなたはこれをしなければならないでしょう

class A(object):

    def __init__(self):
        self.value = []

    def method(self, new_value):
        self.value.append(new_value)

これで、インスタンスごとに異なるリストが作成されました。

編集:を使用するとどうなるかを説明してみましょうstr

class A(object):

    self.value = 'str'

    def method(self):
        self.value += '1'

前のコードの最後の行はこれと同じです:

        self.value = self.value + '1'

さて、これは何が起こっているのかを見るのを少し簡単にします。まず、pythonはから値を取得しますself.value。にはまだインスタンスフィールドが定義されていないためself、これにより'str'。これに追加して、と呼ばれるインスタンスフィールド'1'に設定します。これはvalue

self.value = 'str1'

これは、メソッドにインスタンスフィールドを設定するのと同じです__init__(私の最初のコードスニペットで)。

self.value = []

それはそれを明確にしますか?

于 2012-04-10T08:57:13.173 に答える
6

で定義value__init__()ます。インスタンス属性を定義する他の方法はありません。

インスタンスメソッドの外部にバインドされた属性はクラス属性であり、そのクラスのすべてのインスタンスで共有されます。したがって、例で気付いたように、クラス属性にバインドされたオブジェクトの変更は、クラスのすべてのインスタンスに影響します。

于 2012-04-10T08:48:54.553 に答える