파이썬의 클래스에도 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 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    이는 문화의 차이입니다. 파이썬에서는 다른 클래스의 인스턴스나 변수에 값을 쓰지 않습니다. 자바에서는 만약 정말로 그런 일을 하고 싶다면 그를 막아줄 방법이 없습니다. 결국, 클래스의 소스코드 자체를 편집해버리면 같은 효과를 만들어낼 수 있기 때문이죠. 파이썬에서는 이런 보안에 대한 속임수를 없애버리고 프로그래머로 하여금 책임감을 갖도록 장려합니다. 그리고 실제로 이는 효과가 있죠.

    만약 어떤 이유에서든 private 변수를 사용하고 싶다면, PEP 8에 따라 변수명 앞에 __를 붙이는 방법으로 private 변수를 모방할 수 있습니다. 파이썬에서는 클래스 밖에서 변수가 노출되는 것을 힘들게 하기 위해 __foo와 같이 변수명을 지정합니다. (물론 이 또한 자바에서의 변수 보호와 마찬가지로 마음만 먹으면 뚫을 수 있습니다.)

    비슷한 관습으로, _ 접미사는 원칙적으로 해당 변수로의 접근이 막혀있지 않더라도 그러지 말라는 의미로 사용됩니다. 따라서 다른 클래스의 __foo_bar와 같은 형식의 변수에는 접근하지 않는 것이 원칙입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)