[Python] __변수 사용의 주의점 Develop Tip

파이썬 프로그램을 하다보면 모듈의 위에 __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 로 변수명을 수정하면,

원하는 결과가 잘 나옵니다.

오늘의 결론은 아주 특별한 경우를 제외하고는 __변수명 이라고 지정하지 말자. 였습니다.


어느 분께는 도움이 되셨기를...

덧글

  • 지나가다 2015/07/09 21:09 # 삭제 답글

    _는 public __는 private 정도로 생각하시면 됩니다.
    단, __는 클래스 이름이 붙기 때문에 상속시에 중복을 피할 수 있다는 점이 좀 다르죠.
  • 지나가다 2015/07/09 21:10 # 삭제 답글

    public이 아니라 protected 를 쓰려 했습니다.
  • 지훈현서아빠 2015/07/10 09:14 #

    네, 위에 것들도 근본을 알고 접근하지 않으면 애를 먹는 경우가 언젠가는 생기더라구요.
    조언 감사드립니다~ ^^
댓글 입력 영역

구글애드텍스트