以此为例:
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_var
和string_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已经更新了所有这些,但字符串没有?
答案 0 :(得分:3)
你对他们做了不同的事情。对于dict,你这样做了:
liz1.dict_class_var['first'] = "david"
这会修改现有的字典。
对于字符串,你这样做了:
liz1.string_class_var = "lion"
这不会修改字符串,但会将属性设置为 new 字符串。由于您在实例liz1
上设置了属性,因此它会在实例上设置它,而不是在类。
如果要设置class属性,则需要执行Lizard.string_class_var = "lion"
。
请注意,即使该类已具有相同名称的属性,在实例上设置它也会创建一个新的实例属性,该属性会隐藏类属性。如果要分配给class属性,则需要明确命名该类。