파이썬 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 답변
-
자 확실하게 하죠
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'
댓글 입력