파이썬의 클래스에도 private 변수가 있나요?
조회수 9065회
저는 자바를 사용하다가 Bruce Eckels의 Python 3 Patterns, Recipes and Idioms를 읽으며 파이썬을 배우고 있습니다.
클래스에 대해 읽고 있던 중, 파이썬에서는 변수를 별도로 선언해 줄 필요 없이 생성자에서 사용만 해주면 변수가 생성된다는 것을 알게 되었습니다.
아래와 같이 말이죠 :
class Simple:
def __init__(self1, str):
print("inside the simple constructor")
self1.s = str
def show(self1):
print(self1.s)
def showMsg (self, msg):
print (msg + ':', self.show())
만약 이것이 사실이라면, 아래와 같이 Simple
클래스의 객체의 변수 s
는 클래스 외부에서도 그냥 바뀔 수 있다는 뜻이 되겠죠.
if __name__ == "__main__":
x = Simple("constructor argument")
x.s = "test15" # this changes the value
x.show()
x.showMsg("A message")
저는 자바를 통해 public / private / protected 변수에 대해 배웠고, 내부 변수에 대한 클래스 외부에서의 접근을 허용하고 싶지 않을 경우가 있기 때문에 이러한 키워드들의 존재는 타당합니다. 왜 파이썬에는 이러한 개념이 필요하지 않은건가요?
1 답변
-
이는 문화의 차이입니다. 파이썬에서는 다른 클래스의 인스턴스나 변수에 값을 쓰지 않습니다. 자바에서는 만약 정말로 그런 일을 하고 싶다면 그를 막아줄 방법이 없습니다. 결국, 클래스의 소스코드 자체를 편집해버리면 같은 효과를 만들어낼 수 있기 때문이죠. 파이썬에서는 이런 보안에 대한 속임수를 없애버리고 프로그래머로 하여금 책임감을 갖도록 장려합니다. 그리고 실제로 이는 효과가 있죠.
만약 어떤 이유에서든 private 변수를 사용하고 싶다면, PEP 8에 따라 변수명 앞에
__
를 붙이는 방법으로 private 변수를 모방할 수 있습니다. 파이썬에서는 클래스 밖에서 변수가 노출되는 것을 힘들게 하기 위해__foo
와 같이 변수명을 지정합니다. (물론 이 또한 자바에서의 변수 보호와 마찬가지로 마음만 먹으면 뚫을 수 있습니다.)비슷한 관습으로,
_
접미사는 원칙적으로 해당 변수로의 접근이 막혀있지 않더라도 그러지 말라는 의미로 사용됩니다. 따라서 다른 클래스의__foo
나_bar
와 같은 형식의 변수에는 접근하지 않는 것이 원칙입니다.
댓글 입력