【问题标题】:Python 2.7 class attribute strange behavior [duplicate]Python 2.7类属性奇怪的行为[重复]
【发布时间】:2015-02-24 15:58:15
【问题描述】:

以此为例:

class Lizard(object):
    dict_class_var = {"first": "jon", "last": "do"}
    string_class_var = "monkey"


def test():
    liz1 = Lizard()
    liz1.dict_class_var['first'] = "david"
    liz1.string_class_var = "lion"
    print "dict: {}".format(liz1.dict_class_var)
    print "str: {}".format(liz1.string_class_var)

    liz2 = Lizard()
    print "dict: {}".format(liz2.dict_class_var)
    print "str: {}".format(liz2.string_class_var)

    liz3 = Lizard()
    print "dict: {}".format(liz3.dict_class_var)
    print "str: {}".format(liz3.string_class_var)

Lizard 类有两个类级属性。在test 中,我用Lizard() 初始化3 个变量,我希望它们都指向相同的dict_class_varstring_class_var,我已经用liz1 更新了它们,但这是输出:

dict: {'last': 'do', 'first': 'david'}
str: lion
dict: {'last': 'do', 'first': 'david'}
str: monkey
dict: {'last': 'do', 'first': 'david'}
str: monkey

为什么所有的字典都更新了,而字符串却没有?

【问题讨论】:

  • 因为字典是可变的liz1.string_class_var = "lion" 将新的字符串对象分配给实例属性。
  • @Martijn:这并不是真正的重复。那就是问为什么类变量是共享的。 OP 似乎知道这一点,并且想要它;这就是为什么数据共享的原因。
  • @BrenBarn:是的;它告诉您分配给实例意味着您没有共享。
  • @MartijnPieters:也许,但这不是问题的重点。在我看来,这里的问题似乎很清楚,即使类属性已经存在,OP 也没有意识到 instance.obj = blah 设置了实例属性。 (这可能也是一个骗局,但我现在找不到。)
  • @BrenBarn:在可变类属性的上下文中,有几个答案解决了实例与类属性。这只是常见问题解答的另一种变体。

标签: python string python-2.7 dictionary


【解决方案1】:

你对他们做了不同的事情。对于字典,你这样做了:

liz1.dict_class_var['first'] = "david"

这会修改现有的字典。

对于字符串,你这样做了:

liz1.string_class_var = "lion"

这不会修改字符串,而是将属性设置为 new 字符串。由于您在实例liz1 上设置了属性,因此它将它设置在实例上,而不是类上。

如果要设置class属性,需要Lizard.string_class_var = "lion"

请注意,即使类已经有一个同名的属性,在实例上设置它也会创建一个新的实例属性,它会隐藏类属性。如果要分配给类属性,则需要显式命名类。

【讨论】:

  • 谢谢。您的回答以及 Martijn 的评论让我很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2016-04-19
相关资源
最近更新 更多