如何在类的初始属性中生成空列表?

2024-09-21 04:45:03 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个代码:

>>> 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]

这只发生在列表上。是在初始化中定义的唯一方法吗?
如何在python中定义默认类值?

升级版

谢谢你的回复

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


Tags: 方法代码self列表new定义objectvalue
2条回答

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

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

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

明白了吗?

相关问题 更多 >

    热门问题