파이썬은 다음과 같이 이름에 이중 밑줄을 추가하여 클래스 내에서 '비공개'메소드와 변수를 작성할 수있는 기능을 제공합니다 __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!!
캡슐화에 너무 많은, 응?
어쨌든, 나는 항상 파이썬이 캡슐화를 지원하지 않는다고 들었습니다. 무엇을 제공합니까?