파이썬 private 함수를 외부에서 호출할 수 있을까?¶
테스트용 클래스를 작성하자.
In [13]:
class MyClass:
def myPublicMethod(self):
print ('this is public')
def __myPrivateMethod(self):
print ('this is private!!')
public 함수 호출은 문제 없다.
In [14]:
obj = MyClass()
obj.myPublicMethod()
this is public
private 함수 호출은 이렇게는 안 되긴 한다.
In [16]:
obj.__myPrivateMethod()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_21220\4144280748.py in <module>
----> 1 obj.__myPrivateMethod()
AttributeError: 'MyClass' object has no attribute '__myPrivateMethod'
그러나 아래 값을 보면, 파이썬이 private 함수를 호출할 수 있도록 비밀스런 이름을 제공해준다.
In [17]:
print(dir(obj))
['_MyClass__myPrivateMethod', '__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__', 'myPublicMethod']
바로 이 부분이다 --> _MyClass__myPrivateMethod를 호출해보자.
In [18]:
obj._MyClass__myPrivateMethod()
this is private!!
짠. private 함수가 호출된 것을 알 수 있다. 접근한정자가 private이니 이것이 불가능해야 하는데, 어떻게 된 것인가! --> 이것이 stack overflow 질문 내용.
이것이 왜 가능한 것인가에 대한 답변들:
- private 함수 앞에 __를 붙이는 것은 실수로 그 메서드를 오버라이드하지 말라는 것이지, 외부에서 접근하지 못하도록 막으려는 것이 아니다.
- 캡슐화도 결국 코드를 더 쉽게 이해할 수 있게 하려는 하나의 패턴에 불과하다.
즉... private로 멤버함수에 접근하지 못하도록 제한하는 건 "pythonic way"가 아니라는 소리. private으로 의도해서 작성했고, 그 사실을 인지하고 있는데도 굳이 외부에서 호출하겠다면 sure! 그러라는 거다. 자유로이 코딩하되, 책임도 작성자가 지고. "we're all consenting adults here"
'개발 노트 > 파이썬' 카테고리의 다른 글
각종 기초 문법 정리 (0) | 2023.02.03 |
---|