如何在课程的初始attr中制作空列表?

时间:2012-04-10 08:43:59

标签: python oop

这是一段代码:

>>> 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不是?

2 个答案:

答案 0 :(得分:8)

您定义的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 = []

这是否说清楚了?

答案 1 :(得分:5)

value中定义__init__()。没有其他方法可以定义实例属性。

在实例方法外部绑定的属性是类属性,并由该类的所有实例共享。因此,绑定到类属性的对象的修改会影响类的所有实例,正如您在示例中所注意到的那样。