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