2014-12-27 2 views
2

는 예로서 이것을 가지고 이상한 행동 특성 :파이썬 2.7 클래스는

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 개 변수를 초기화 그리고 난 그들 모두가 내가 liz1으로 업데이트 한 같은 dict_class_varstring_class_var를 가리키는 지 기대하고 있습니다 그러나 이것은 출력 :

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

DICT가 된 이유 그들 모두를 위해 업데이트되었지만 문자열은 그렇지 못했습니까?

+1

사전은 * 변경할 수 있기 때문에 *. 'liz1.string_class_var = "lion"'은 새로운 문자열 객체를 인스턴스 속성에 할당합니다. –

+0

@Martijn : 그건 사실 복제품이 아닙니다. 그것은 왜 클래스 변수가 공유되는지를 묻는 것입니다. OP는 그것을 알고있는 것처럼 보이고 그것을 원한다. 이것은 왜 데이터가 공유되지 않는지에 대한 것입니다. – BrenBarn

+0

@BrenBarn : 예, 그렇습니다. 인스턴스에 지정하면 공유하지 않는다는 의미입니다. –

답변

3

당신은 그들에게 다른 것을했습니다. dict의 경우 다음을 수행했습니다.

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

이렇게하면 기존 명령이 수정됩니다. 문자열에 대한

, 당신이 한 :

liz1.string_class_var = "lion" 

이는 문자열을 수정하지 않습니다,하지만 새로운 문자열 속성을 설정합니다. 속성을 인스턴스 liz1에 설정 했으므로 클래스가 아닌 인스턴스에 속성을 설정합니다.

클래스 속성을 설정하려면 Lizard.string_class_var = "lion"을 수행해야합니다.

클래스에 이미 같은 이름의 특성이있는 경우에도 해당 인스턴스에 특성을 설정하면 클래스 특성을 음영 처리하는 새 인스턴스 특성이 만들어집니다. class 속성에 할당하려는 경우 명시 적으로 클래스의 이름을 지정해야합니다.

+0

감사합니다. Martijn의 코멘트와 함께 당신의 대답은 나에게 분명했다. – norbertpy