2016-10-14 7 views
0

파이썬에서 간단한 테스트 예제 인 setattr()을 설정하려고하는데, 멤버에게 새로운 값을 할당하지 못했습니다. Python setattr()이 클래스 멤버에게 값을 할당하지 않습니다.

class Foo(object): 
    __bar = 0 
    def modify_bar(self): 
     print(self.__bar) 
     setattr(self, "__bar", 1) 
     print(self.__bar) 

여기에 내가 setattr(self, "bar", 1)로 변수 할당을 시도했지만 실패했습니다 :

>>> foo = Foo() 
>>> foo.modify_bar() 
0 
0 

누군가가 후드 아래에 무슨 일이 일어나고 있는지 설명 할 수 있습니다. 저는 파이썬에 익숙하지 않으므로 초등 질문을 용서하십시오.

답변

0

앞에 오는 두 개의 밑줄은 파이썬 name-mangling을 호출합니다.

그래서 :

class Foo(object): 
    __bar = 0 # actually `_Foo__bar` 
    def modify_bar(self): 
     print(self.__bar) # actually self._Foo__bar 
     setattr(self, "__bar", 1) 
     print(self.__bar) # actually self._Foo__bar 

이름 setattr 함수 호출에 __bar이 영향을받지 않는 이유입니다, 식별자가 아닌 문자열에 적용 맹 글링.

class Foo(object): 
    _bar = 0 
    def modify_bar(self): 
     print(self._bar) 
     setattr(self, "_bar", 1) 
     print(self._bar) 

은 예상대로 작동해야합니다.

선행 이중 밑줄은 일반적으로 대부분의 파이썬 코드에서 자주 사용되지 않습니다 (그 사용이 일반적으로 권장되지 않기 때문에). 몇 가지 유효한 유스 케이스가 있지만 (주로 서브 클래 싱 할 때 이름 충돌을 피하기 위해), 희귀하기 때문에 이름 맹 글링은 일반적으로 야생에서 피할 수 있습니다.