2008-10-25 3 views
1

파이썬의 개인 변수/멤버/함수/접근 방식에 대한 대부분의 내용을 알고 있습니다 ...외부에서 호출 할 객체 메소드와 서브 클래스에서 호출 할 객체 메소드를 구별하는 관례는 무엇입니까?

그러나 외부 사용 또는 하위 클래스 사용 방법을 구별하는 방법에 대해서는 신경을 쓰지 않습니다 .

다음과 같은 예를 생각해 :이 예에서

class EventMixin(object): 
    def subscribe(self, **kwargs): 
     '''kwargs should be a dict of event -> callable, to be specialized in the subclass''' 

    def event(self, name, *args, **kwargs): 
     ... 

    def _somePrivateMethod(self): 
     ... 

를, 내가 만들고 싶어 그 이벤트가해야하는 방법 동안, 클래스/객체의 외부 사용자가 사용하는 방법은 가입이 명확 외부에서 호출되지 않고 하위 클래스 구현에서 호출됩니다.

지금 당장 공용 API의 두 부분을 고려하므로 밑줄을 사용하지 마십시오. 그러나이 특정 상황에서는 예를 들어 외부 API에 밑줄을 사용하지 말고 하위 클래스 API에 밑줄을 사용하지 말고 개인/내부 API에 대해서는 밑줄 두 개를 사용하는 것이 좋습니다. 다음 내부 API가 코딩 현명한, documentationwise, 또는 그렇지 않으면 규칙은 무엇인가,

그래서
self._EventMixin__somePrivateMethod() 

로 호출 될 필요가 있기 때문에, 그 다루기가 될 것인가?

+0

파이썬은 보호 된 멤버를 지원하지 않습니까? Oo – OregonGhost

+0

컴파일러는 보호 된 멤버를 시행하지 않습니다. 대회만으로 끝났습니다. –

답변

3
use no underscores for the external API, 
one underscore for the subclassable API, 
and two underscores for the private/internal API 

이렇게하는 것이 합리적이고 비교적 일반적인 방법입니다. 그렇습니다. C++ 용어로 'protected'와는 달리, 이중 밑줄은 실제로는 거의 사용되지 않습니다. 서브 클래스가 오버라이드 (override)하려고하는 행동을 결코 알지 못하기 때문에 '보호 된'것으로 가정하면 일반적으로 좋은 방법이 될 수 있습니다.

However, that would become unwieldy because then the internal API would 
need to be invoked as self._EventMixin__somePrivateMethod() 

아니요. 이중 밑줄 버전 만 사용하면 자동으로 munged됩니다. 못생긴지만 작동합니다.

2

일반적으로 유닛 테스트가 매우 고통 스럽기 때문에 이중 __을 사용하면 더 큰 문제가 될 수 있습니다. 특정 클래스/모듈의 공용 인터페이스의 일부가 아닌 메소드/속성에 대한 규약으로 single _을 사용하는 것이 저의 선호 방식입니다.

2

나는 이런 종류의 구별이있을 때 상속 대신 컴포지션을 사용하는 것을 고려하는 것이 좋습니다. 즉, EventMixin을 상속하는 대신 (아마도 이름이 바뀔 것임) 인스턴스화합니다.

관련 문제