> 백엔드 개발 > 파이썬 튜토리얼 > Python의 '비공개' 메서드는 실제로 얼마나 비공개인가요?

Python의 '비공개' 메서드는 실제로 얼마나 비공개인가요?

Barbara Streisand
풀어 주다: 2024-12-11 12:15:11
원래의
587명이 탐색했습니다.

How Private Are Python's

Python의 "비공개" 메서드: 보이는 것만큼 뚫을 수는 없습니다

Python의 "비공개" 메서드가 강력한 캡슐화를 제공한다는 오해에도 불구하고 면밀히 조사해 보면 그들이 진정한 사적인 것이 아니라는 사실이 드러납니다. 메서드 앞에 이중 밑줄(__myPrivateMethod())이 붙는 것은 개인 범위를 암시하지만 실제로는 수정된 이름을 가진 메서드를 생성합니다.

예를 들어 다음 클래스는 이 동작을 보여줍니다.

class MyClass:
    def myPublicMethod(self):
        print('public method')

    def __myPrivateMethod(self):
        print('this is private!!')
로그인 후 복사

이 클래스의 객체를 인스턴스화할 때 개인 클래스에 액세스할 수 없을 것으로 예상됩니다. 메소드:

obj = MyClass()
obj.myPublicMethod()
로그인 후 복사

그러나 후속 dir(obj) 호출은 마술처럼 생성된 메소드의 존재를 드러냅니다.

dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
로그인 후 복사

이 메소드를 호출하면 "비공개" 데이터가 드러납니다.

obj._MyClass__myPrivateMethod()
로그인 후 복사

이 명명 규칙은 하위 클래스가 해당 하위 클래스의 비공개 메서드와 속성을 실수로 재정의하는 것을 방지하기 위해 사용됩니다. 슈퍼클래스. 그러나 외부로부터의 고의적인 액세스를 방해하지는 않습니다.

예:

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}
로그인 후 복사

결론적으로 Python의 "비공개" 메서드는 하위 클래스에서 액세스할 수 있도록 허용하는 진정한 비공개 메서드가 아닙니다. 이 디자인 선택은 엄격한 캡슐화보다 서브클래싱 유연성을 우선시하지만 코드 무결성을 유지하려면 개발자가 주의 깊게 사용해야 합니다.

위 내용은 Python의 '비공개' 메서드는 실제로 얼마나 비공개인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿