Python의 '비공개' 메소드가 실제로 비공개가 아닌 이유
Python에서 '비공개' 메소드를 나타내는 데 일반적으로 사용되는 이중 밑줄 접두어에도 불구하고, 이러한 메소드는 약간 다른 명명 규칙을 통해 사용자가 액세스할 수 있습니다.
Python 인터프리터 이러한 '비공개' 메서드의 이름을 "_ClassName__MethodName"으로 바꿉니다. 따라서 '비공개' 메서드 "__myPrivateMethod()"는 "_MyClass__myPrivateMethod()"로 호출될 수 있습니다.
이 이름 스크램블링은 캡슐화 형태로 사용되거나 외부 액세스를 방지하기 위한 것이 아닙니다. 대신, 서브클래스가 실수로 슈퍼클래스의 '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)
Bar 인스턴스를 생성하고 호출할 때 foo()와 bar() 모두 다음과 같은 출력을 볼 수 있습니다.
x = Bar() x.foo() 42 x.bar() 21
출력에서 알 수 있듯이 하위 클래스는 슈퍼클래스의 'private' 속성에 영향을 주지 않고 __baz 값을 성공적으로 재정의합니다. 더욱이 x.__dict__에 액세스하면 __baz 속성의 두 버전이 모두 하위 클래스 인스턴스 내에 공존한다는 사실이 드러납니다.
이 이름 스크램블링은 우발적인 재정의를 방지할 수 있지만 외부 소스에서 '비공개' 메서드에 대한 의도적인 액세스를 막지는 못합니다. 결과적으로 Python의 '비공개' 메소드는 진정한 비공개가 아니므로 캡슐화에 의존해서는 안 됩니다.
위 내용은 Python의 '비공개' 메서드는 정말 비공개인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!