>백엔드 개발 >파이썬 튜토리얼 >Python의 '비공개' 메서드는 정말 비공개인가요?

Python의 '비공개' 메서드는 정말 비공개인가요?

Barbara Streisand
Barbara Streisand원래의
2024-12-02 22:33:11461검색

Are Python's

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.