2013-02-24 3 views
5

파이썬 3.2에서 '보호 된'액세스로 클래스 계층을 설정하고 싶습니다. 기본 클래스의 멤버는 'public'이 아닌 파생 클래스에만 적용됩니다.파이썬에서 "보호 된"접근 - 어떻게?

두 줄로 된 밑줄은 회원을 '비공개'로 만들고, 밑줄 문자는 경고를 표시하지만 회원은 '공개'상태로 유지됩니다. 무엇이 (있다면 ...) '보호 된'멤버를 지정하는 올바른 구문입니다.

+6

할 수 없습니다. '_single_underscore' 규칙을 사용하면 행복합니다. – JBernardo

답변

8

파이썬에서의 회원 접근 허용은 "협상"과 "협약"에 의해 작동합니다. 강제로 적용되는 것은 아닙니다.

다른 말로하면, 사용자는 자신의 사업이 아닌 일에서 손을 떼야한다고 생각하지만, 자신의 액세스가 (일반적으로) 적합하지 않다는 것을 분명히하는 _xxx 식별자를 사용하는 것 이외에는 적용 할 수 없습니다 .

+0

그래서 불가능합니다. 승인. 그러나 나는 여러 번 표명 한 '조약'에 '힘'이 아닌 문제를 안고있다. 접근 지시자에 대한 생각은 다른 사람들이 무언가를하지 못하게하는 것이 아니다. 명확하고 구조화 된 코드 구성입니다. 제 언어가 도와주기를 바랍니다. 모든 종류의 미친 해킹을위한 통로를 남겨 두지 마십시오.이 미친 해킹은 흔히 볼 수있는 Python 코드에서 모두 공통적입니다. (아마 내가 파이썬을 사용해서는 안된다는 것을 나타냅니다 ...) – Vector

3

이중 밑줄은 C++ 또는 Java의 의미에서 'private'멤버를 만들지 않습니다. Python은 그런 종류의 언어 적용 액세스 규칙을 상당히 명시 적으로 피합니다. A 단일 밑줄은 속성 또는 메소드를 "구현 세부 사항"으로 표시합니다. 즉, 외부에있는 것들은 여전히 ​​얻을 수 있지만 이것은 클래스 인터페이스에서 지원되는 부분이 아니므로, 클래스가 불변성 또는 back/forwards 호환성에 대해 만들 가능성이 더 이상 적용되지 않습니다. 이것은 '사적'(인터페이스와 구현의 분리)과 같은 개념적 문제를 다른 방식으로 해결합니다. -

더블 여전히 '개인'아닌 이름 맹 글링을 호출 강조

그것은함으로써, 위의 단지 약간 강한 배합이다 : -이 기능은, 하지만 이 클래스의 구현 세부입니다 - 서브 클래스 수도 합리적 __name 클래스의 이름을 포함 엉망이된다 이것은 언어 지원의 조금 걸리는 원래

의 재정의 된 버전으로 의미 아니라고 동일한 이름의 메소드가 기대 - 서브 클래스 버젼의 버젼은 오버라이드 (override) 대신에 다른 이름이됩니다. 서브 클래스 나 외부 코드가 실제로 원한다면 그 메소드를 호출하는 것은 여전히 ​​가능합니다. - 이름 변환의 목표는 명시 적으로 이 아니라이 아니기 때문에 가능합니다.

그러나 때문에이 모든

은 '보호'파이썬에서 많은 이해하지 끈다 - 당신은 정말는 현실적으로 서브 클래스에 의해 호출 (그리고하지 않는 불변에게 을 깰 수있는 방법, 당신 아마 돈이있는 경우 파이썬 웨이는 문서화하는 것입니다. docstring에 "이것은 서브 클래스에서만 호출된다고 가정합니다"라는 메시지를 넣고 클라이언트가 올바른 일을 할 것이라는 가정하에 실행합니다. 그렇지 않으면 문제가됩니다.

+0

'이중 밑줄은 C++ 또는 Java의 감각으로'private '멤버를 만들지 않습니다.'- 이해합니다. 그래서 '개인적'이라고 따옴표로 묶은 것입니다. 하지만 기분 전환을 가져 주셔서 감사합니다. – Vector