프로그래밍 언어/Python

파이썬의 'private' 메소드가 실제로 비공개가 아닌 이유

Rateye 2021. 10. 13. 11:59
728x90
반응형
질문 : 파이썬의 '비공개'메소드가 실제로 비공개가 아닌 이유는 무엇입니까?

__myPrivateMethod() 와 같이 이름 앞에 이중 밑줄을 추가하여 클래스 내에서 '개인'메서드와 변수를 생성 할 수있는 기능을 제공합니다. 그렇다면 이것을 어떻게 설명 할 수 있습니까?

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!

거래는 무엇입니까?!

잘 이해하지 못한 분들을 위해 조금 설명하겠습니다.

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()

내가 한 일은 공용 메서드와 개인 메서드로 클래스를 만들고 인스턴스화하는 것입니다.

다음으로 공개 메소드를 호출합니다.

>>> obj.myPublicMethod()
public method

다음으로 개인 메서드를 호출합니다.

>>> obj.__myPrivateMethod()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: MyClass instance has no attribute '__myPrivateMethod'

여기에서는 모든 것이 좋아 보입니다. 우리는 그것을 부를 수 없습니다. 사실 '비공개'입니다. 글쎄, 실제로는 그렇지 않습니다. 객체에서 dir () 을 실행하면 파이썬이 모든 '개인'메소드에 대해 마법처럼 생성하는 새로운 마법의 메소드가 나타납니다.

>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']

이 새 메서드의 이름은 항상 밑줄, 클래스 이름, 메서드 이름 순입니다.

>>> obj._MyClass__myPrivateMethod()
this is private!!

캡슐화를 위해 너무 많이, 응?

어쨌든, 나는 항상 파이썬이 캡슐화를 지원하지 않는다고 들었는데, 왜 시도조차할까요? 무엇을 제공합니까?

답변

이름 스크램블링은 하위 클래스가 해당 수퍼 클래스의 개인 메서드 및 속성을 실수로 재정의하지 않도록하는 데 사용됩니다. 외부로부터의 고의적 인 액세스를 방지하도록 설계되지 않았습니다.

예를 들면 :

>>> class Foo(object):
...     def __init__(self):
...         self.__baz = 42
...     def foo(self):
...         print self.__baz
...     
>>> class Bar(Foo):
...     def __init__(self):
...         super(Bar, self).__init__()
...         self.__baz = 21
...     def bar(self):
...         print self.__baz
...
>>> x = Bar()
>>> x.foo()
42
>>> x.bar()
21
>>> print x.__dict__
{'_Bar__baz': 21, '_Foo__baz': 42}

물론 두 개의 다른 클래스가 같은 이름을 가지면 분류됩니다.

출처 : https://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private
728x90
반응형