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

Rnd*_*d_d 4 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]
Run Code Online (Sandbox Code Playgroud)

这只发生在列表中.是__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'
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么列表是共享但str不是?

Shr*_*rat 8

value要定义不是你的类,它更像是一个静态字段的实例字段.但是python不介意你从实例访问这个字段.因此,即使您从实例访问此字段,它也不是每个实例的不同列表.基本上,每次调用方法时,您都会附加到同一个列表中.

你必须这样做

class A(object):

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

    def method(self, new_value):
        self.value.append(new_value)
Run Code Online (Sandbox Code Playgroud)

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

编辑:让我试着解释当你使用a时会发生什么str.

class A(object):

    self.value = 'str'

    def method(self):
        self.value += '1'
Run Code Online (Sandbox Code Playgroud)

上一代码中的最后一行与此相同:

        self.value = self.value + '1'
Run Code Online (Sandbox Code Playgroud)

现在,这使得它更容易看到正在发生的事情.首先,python从中获取值self.value.由于尚未定义实例字段self,因此这将给出'str'.添加'1'到该文件并将其设置为名为的实例字段value.这就像

self.value = 'str1'
Run Code Online (Sandbox Code Playgroud)

这与您在__init__方法中设置实例字段相同(在我的第一段代码中).

self.value = []
Run Code Online (Sandbox Code Playgroud)

这清楚了吗?


lun*_*orn 5

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

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