- 작성시간 : 2015/07/08 12:18
- 퍼머링크 : mcchae.egloos.com/11175167
- 덧글수 : 3
파이썬 프로그램을 하다보면 모듈의 위에 __global_variable 등과 같이








'__' 로 시작하는 변수 등이 있습니다.
다음 아래와 같은 간단한 프로그램이 있습니다.

__gtest = 0
class C:
def method_A(self):
global __gtest
__gtest += 1
return __gtest
if __name__== '__main__':
c = C()
print c.method_A()
이 프로그램을 돌려보면

위와 같은 예외가 발생합니다.
어라... 왜 변수명이 _C__gtest 로 바뀌었지?? 하고 문서를 찾아보니
__gtest 와 같은 것은 사용되는 '_' + 클래스(모듈?)명 이 해당 변수명 앞에 자동으로 확장된다는 것이었습니다.

위와 같이 __gtest 대신 g_test 라고 변수명을 지정하면,

원하는 결과가 잘 나옵니다.
이제는 클래스 함수 내에서 hasattr 등을 한번 볼까요?

class C:
def method_A(self):
if not hasattr(self,'my_attr'):
self.my_attr = 0
print "my_attr created!"
self.my_attr += 1
return self.my_attr
if __name__== '__main__':
c = C()
print c.method_A()
print c.method_A()
위와 같은 경우 이를 실행시키면,

와 같이 나옵니다.
이상합니다. 왜 해당 클래스의 __attr 이라는 변수가 지정이 안되어서
계속 초기화 if 문으로 들어가는 것일까요?
결론은 아마도 이것도 __ 자동 확장 때문일 것으로 생각됩니다.

위와 같이 __attr 대신 my_attr 로 변수명을 수정하면,

원하는 결과가 잘 나옵니다.
오늘의 결론은 아주 특별한 경우를 제외하고는 __변수명 이라고 지정하지 말자. 였습니다.
어느 분께는 도움이 되셨기를...



덧글
단, __는 클래스 이름이 붙기 때문에 상속시에 중복을 피할 수 있다는 점이 좀 다르죠.
조언 감사드립니다~ ^^