파이썬 private 변수 질문

조회수 490회
class num():
    def __init__(self, v):
        self.__k = v

    def getK(self):
        return self.__k

    def setK(self, v):
        self.__k = v


n = num(10)
 # print(n.__k) 접근 불가(에러)
print(n.getK())

n.setK(20) # 잘됨
print(n.getK())

n.__k = 30 # 이 코드가 왜 되는가?
           # 이 코드가 있으면 아래 print도 됨. 없으면 에러
print(n.__k)

실행해 보면 10 20 30 이 아주 잘 출력됩니다.

인스턴스 안의 변수 앞에 언더스코어 2개 __ 를 쓰면 외부에서 접근 할 수 없는 private가 된다고 배웠습니다. 근데 n.__k = 30은 왜 되는건가요? 그리고 이때에 밑에줄에 print는 또 왜 되는건가요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    자 확실하게 하죠

    python 은 private 가 없습니다.

    __ 던더 표기는 단순 네임 맹글링을 합니다.

    하기의 코드에서 a 는 ```_Aa``` 로 이름만 변경하는 겁니다.

    파이썬은 그런 언어이고...프로그래밍 언어학적으로 보면 문제가 많아 보입니다만 그래서 쓰기 편한 겁니다.

    >>> class A:
    ...     __a = 1
    ...     
    >>> 
    >>> dir(A)
    ['_A__a',
     '__class__',
     '__delattr__',
     '__dict__',
     '__dir__',
     '__doc__',
     '__eq__',
     '__format__',
     '__ge__',
     '__getattribute__',
     '__gt__',
     '__hash__',
     '__init__',
     '__init_subclass__',
     '__le__',
     '__lt__',
     '__module__',
     '__ne__',
     '__new__',
     '__reduce__',
     '__reduce_ex__',
     '__repr__',
     '__setattr__',
     '__sizeof__',
     '__str__',
     '__subclasshook__',
     '__weakref__']
    >>> a = A()
    >>> a._A__a
    1
    >>> a.__a
    Traceback (most recent call last):
      File "<interactive input>", line 1, in <module>
    AttributeError: 'A' object has no attribute '__a'
    
    • 감사합니다. 답변의 "네임 맹글링" 이 무엇인가 찾아보다가 " 파이썬에는 접근지정자라는 개념이 존재하지 않는다. 맹글링을 통해 변수 또는 함수 이름 앞에 __를 표기하여 private와 유사한 성격의 코드를 작성할 수 있다. 맹글링은 아예 외부 접근을 불가능하게 하는 것이 아니라, 변수 이름을 변형시켜 직접 접근을 일부 막아주는 기능이기 때문에 완벽한 접근지정자라고 할 수는 없다." 라는 것을 알게되었습니다. 이혁기 2020.9.24 11:37

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

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

(ಠ_ಠ)
(ಠ‿ಠ)