这里有一个代码:
>>> 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不是?
在
__init__()
中定义value
。没有其他方法可以定义实例属性。在实例方法外部绑定的属性是类属性,并由该类的所有实例共享。因此,正如您在示例中注意到的,绑定到类属性的对象的修改会影响类的所有实例。
您定义的
value
不是类的实例字段,更像是静态字段。但是python不介意您从实例访问这个字段。因此,即使您从实例访问此字段,也不会为每个实例提供不同的列表。基本上,每次调用方法时都会附加到同一个列表。你必须这么做
现在为每个实例创建了一个不同的列表。
编辑:让我来解释一下当您使用
str
时会发生什么。上一代码中的最后一行与下面的代码相同:
现在,这让我们更容易看到发生了什么。首先,python得到 来自
self.value
的值。因为在self
上还没有定义实例字段, 这将给出'str'
。将'1'
添加到该字段,并将其设置为实例字段 称为value
。这就像这与在
__init__
方法中设置实例字段(在 第一段代码)。明白了吗?
相关问题 更多 >
编程相关推荐