4 回答
TA贡献1784条经验 获得超9个赞
你要这个:
class a: def __init__(self): self.list = []
声明类声明中的变量使它们成为“类”成员而不是实例成员。在__init__
方法中声明它们可确保在对象的每个新实例旁边创建成员的新实例,这是您正在寻找的行为。
TA贡献1966条经验 获得超4个赞
接受的答案有效,但更多的解释不会受到伤害。
创建实例时,类属性不会成为实例属性。它们在为其分配值时成为实例属性。
在原始代码中list,实例化后没有为属性赋值; 所以它仍然是一个类属性。在__init__工作中定义列表是因为__init__在实例化之后调用。或者,此代码也会产生所需的输出:
>>> class a:
list = []
>>> y = a()
>>> x = a()
>>> x.list = []
>>> y.list = []
>>> x.list.append(1)
>>> y.list.append(2)
>>> x.list.append(3)
>>> y.list.append(4)
>>> print(x.list)
[1, 3]
>>> print(y.list)
[2, 4]
但是,问题中的混淆场景永远不会发生在诸如数字和字符串之类的不可变对象上,因为如果没有赋值,它们的值就无法更改。例如,类似于具有字符串属性类型的原始代码的工作没有任何问题:
>>> class a:
string = ''
>>> x = a()
>>> y = a()
>>> x.string += 'x'
>>> y.string += 'y'
>>> x.string
'x'
>>> y.string
'y'
总结一下:当且仅当在实例化之后为它们分配值时,类属性才变为实例属性,__init__无论是否在方法中。这是一件好事,因为如果您在实例化后从未为属性赋值,则可以使用静态属性。
TA贡献1859条经验 获得超6个赞
您将“list”声明为“类级属性”而不是“实例级属性”。为了在实例级别定义属性,您需要通过__init__
方法中的“self”参数(或根据具体情况在其他地方)引用来初始化它们。
您不必严格必须初始化方法中的实例属性,__init__
但这样可以更容易理解。
添加回答
举报