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'

我不明白,为什么 list 是共享的,而 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)

现在,您为每个实例创建了不同的列表。

编辑:让我试着解释一下当你使用 a 时会发生什么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 回答