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
반응형
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python array 항목 중에 다른 문자열 안에 문자열이 포함되어 있는지 확인 (0) | 2021.10.14 |
---|---|
정수의 최대 값 및 최소값 (0) | 2021.10.13 |
변수 및 함수 이름에 대한 Python의 명명 규칙 (0) | 2021.10.13 |
파이썬에서 문자열을 정수로 변환하는 방법 (0) | 2021.10.12 |
#! (shebang) Python 스크립트 형식 (0) | 2021.10.12 |