为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免在实例之间共享类数据?

如何避免在实例之间共享类数据?

慕森卡 2019-05-23 10:14:45
如何避免在实例之间共享类数据?我想要的是这种行为:class a:    list = []x = a()y = a()x.list.append(1)y.list.append(2)x.list.append(3)y.list.append(4)print(x.list) # prints [1, 3]print(y.list) # prints [2, 4]当然,我打印时真正发生的是:print(x.list) # prints [1, 2, 3, 4]print(y.list) # prints [1, 2, 3, 4]显然,他们正在课堂上分享数据a。如何获得单独的实例来实现我想要的行为?
查看完整描述

4 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

你要这个:

class a:
    def __init__(self):
        self.list = []

声明类声明中的变量使它们成为“类”成员而不是实例成员。在__init__方法中声明它们可确保在对象的每个新实例旁边创建成员的新实例,这是您正在寻找的行为。


查看完整回答
反对 回复 2019-05-23
?
慕标5832272

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__无论是否在方法中。这是一件好事,因为如果您在实例化后从未为属性赋值,则可以使用静态属性。


查看完整回答
反对 回复 2019-05-23
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您将“list”声明为“类级属性”而不是“实例级属性”。为了在实例级别定义属性,您需要通过__init__方法中的“self”参数(或根据具体情况在其他地方)引用来初始化它们。

您不必严格必须初始化方法中的实例属性,__init__但这样可以更容易理解。


查看完整回答
反对 回复 2019-05-23
  • 4 回答
  • 0 关注
  • 577 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信