파이썬 3.2에서 '보호 된'액세스로 클래스 계층을 설정하고 싶습니다. 기본 클래스의 멤버는 'public'이 아닌 파생 클래스에만 적용됩니다.파이썬에서 "보호 된"접근 - 어떻게?
두 줄로 된 밑줄은 회원을 '비공개'로 만들고, 밑줄 문자는 경고를 표시하지만 회원은 '공개'상태로 유지됩니다. 무엇이 (있다면 ...) '보호 된'멤버를 지정하는 올바른 구문입니다.
파이썬 3.2에서 '보호 된'액세스로 클래스 계층을 설정하고 싶습니다. 기본 클래스의 멤버는 'public'이 아닌 파생 클래스에만 적용됩니다.파이썬에서 "보호 된"접근 - 어떻게?
두 줄로 된 밑줄은 회원을 '비공개'로 만들고, 밑줄 문자는 경고를 표시하지만 회원은 '공개'상태로 유지됩니다. 무엇이 (있다면 ...) '보호 된'멤버를 지정하는 올바른 구문입니다.
파이썬에서의 회원 접근 허용은 "협상"과 "협약"에 의해 작동합니다. 강제로 적용되는 것은 아닙니다.
다른 말로하면, 사용자는 자신의 사업이 아닌 일에서 손을 떼야한다고 생각하지만, 자신의 액세스가 (일반적으로) 적합하지 않다는 것을 분명히하는 _xxx
식별자를 사용하는 것 이외에는 적용 할 수 없습니다 .
그래서 불가능합니다. 승인. 그러나 나는 여러 번 표명 한 '조약'에 '힘'이 아닌 문제를 안고있다. 접근 지시자에 대한 생각은 다른 사람들이 무언가를하지 못하게하는 것이 아니다. 명확하고 구조화 된 코드 구성입니다. 제 언어가 도와주기를 바랍니다. 모든 종류의 미친 해킹을위한 통로를 남겨 두지 마십시오.이 미친 해킹은 흔히 볼 수있는 Python 코드에서 모두 공통적입니다. (아마 내가 파이썬을 사용해서는 안된다는 것을 나타냅니다 ...) – Vector
이중 밑줄은 C++ 또는 Java의 의미에서 'private'멤버를 만들지 않습니다. Python은 그런 종류의 언어 적용 액세스 규칙을 상당히 명시 적으로 피합니다. A 단일 밑줄은 속성 또는 메소드를 "구현 세부 사항"으로 표시합니다. 즉, 외부에있는 것들은 여전히 얻을 수 있지만 이것은 클래스 인터페이스에서 지원되는 부분이 아니므로, 클래스가 불변성 또는 back/forwards 호환성에 대해 만들 가능성이 더 이상 적용되지 않습니다. 이것은 '사적'(인터페이스와 구현의 분리)과 같은 개념적 문제를 다른 방식으로 해결합니다. -
더블 여전히 '개인'아닌 이름 맹 글링을 호출 강조 그것은함으로써, 위의 단지 약간 강한 배합이다 : -이 기능은, 하지만 이 클래스의 구현 세부입니다 - 서브 클래스 수도 합리적 가 __name
클래스의 이름을 포함 엉망이된다 이것은 언어 지원의 조금 걸리는 원래
의 재정의 된 버전으로 의미 아니라고 동일한 이름의 메소드가 기대 - 서브 클래스 버젼의 버젼은 오버라이드 (override) 대신에 다른 이름이됩니다. 서브 클래스 나 외부 코드가 실제로 원한다면 그 메소드를 호출하는 것은 여전히 가능합니다. - 이름 변환의 목표는 명시 적으로 이 아니라이 아니기 때문에 가능합니다.
그러나 때문에이 모든
은 '보호'파이썬에서 많은 이해하지 끈다 - 당신은 정말는 현실적으로 서브 클래스에 의해 호출 (그리고하지 않는 불변에게 을 깰 수있는 방법, 당신 아마 돈이있는 경우 파이썬 웨이는 문서화하는 것입니다. docstring에 "이것은 서브 클래스에서만 호출된다고 가정합니다"라는 메시지를 넣고 클라이언트가 올바른 일을 할 것이라는 가정하에 실행합니다. 그렇지 않으면 문제가됩니다.'이중 밑줄은 C++ 또는 Java의 감각으로'private '멤버를 만들지 않습니다.'- 이해합니다. 그래서 '개인적'이라고 따옴표로 묶은 것입니다. 하지만 기분 전환을 가져 주셔서 감사합니다. – Vector
할 수 없습니다. '_single_underscore' 규칙을 사용하면 행복합니다. – JBernardo