Python 2.7类属性奇怪的行为

时间:2014-12-27 23:20:02

标签: python string python-2.7 dictionary

以此为例:

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

为什么dict已经更新了所有这些,但字符串没有?

1 个答案:

答案 0 :(得分:3)

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

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

这会修改现有的字典。

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

liz1.string_class_var = "lion"

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

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

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