2013-02-24 2 views
5

Я хотел бы создать иерархию классов в Python 3.2 с «защищенным» доступом: члены базового класса будут в области видимости только для производных классов, но не «public».«Защищенный» доступ в Python - как?

Двойное подчеркивание делает элемент «закрытым», одно подчеркивание указывает предупреждение, но член остается «общедоступным». Что (если есть ...) является правильным синтаксисом для обозначения «защищенного» члена.

+6

No can can. Используйте соглашение '_single_underscore' и будьте счастливы. – JBernardo

ответ

8

Право на доступ к членству в Python работает по «переговорам» и «договорам», а не по силе.

Другими словами, пользователь вашего класса должен оставить свои руки от вещей, которые не являются их бизнесом, но вы не можете обеспечить, чтобы другие, кроме моего, использовали идентификаторы _xxx, что абсолютно ясно, что их доступ (как правило) не подходит ,

+0

Так что это невозможно. ОК. Но у меня есть проблема с «договорами», а не «силой», которую я озвучил много раз: идея, связанная с спецификаторами доступа, на самом деле не мешает другим людям что-то делать. Речь идет о четкой, структурированной организации вашего кода. Я хочу, чтобы мой язык помог мне сделать это, не оставляя открытий для всех видов сумасшедших хаков, которые все общаны в коде Python, который я часто вижу. (Указывая, что я, вероятно, не должен использовать Python ...) – Vector

3

Двойные подчеркивания не делают «частным» членом в смысле C++ или Java. Python явно скрывает такие правила доступа к языку. A single подчеркивает, по соглашению, отмечает атрибут или метод как «деталь реализации» - то есть вещи, которые все еще могут получить к нему, но это не поддерживаемая часть интерфейса класса и, следовательно, гарантии, которые класс может сделать относительно инвариантов или обратно/вперед совместимость, больше не применяются. Это решает ту же концептуальную проблему, что и «частный» (разделение интерфейса и реализация) по-другому.

Дважды подчеркивает взывать имя коверкая, который до сих пор не является «частным» - это всего лишь немного сильнее формулировка выше, в результате чего: - Эта функция является деталью реализации этого класса, но - Подклассы может разумно ожидать, чтобы иметь метод с тем же именем, что не означает как перегруженной версии оригинального

Это занимает немного языковой поддержки, в результате чего __name будет наломать включать имя класса - так что подклассные версии получат разные имена вместо переопределения. До сих пор вполне возможно, чтобы подкласс или внешний код вызывали этот метод, если он действительно хочет, - и цель аннулирования имени явно не, чтобы предотвратить это.

Но из всего этого, «защищенный», оказывается, не имеет большого смысла в Python - если вы действительно есть метод, который может нарушить инвариантами , если не называется подклассом (и, реально, вы, вероятно, дон даже если вы думаете, что это так), Путь Python - это просто документ. Поместите примечание в свою docstring к действию «Предполагается, что он вызывается только подклассами» и выполняется с предположением, что клиенты будут поступать правильно, потому что, если они этого не делают, это становится их собственной проблемой.

+0

«Двойные подчеркивания не делают« частным »членом в смысле C++ или Java ...» - поняли. Вот почему сказал «частный» в кавычках. Но спасибо за переподготовку. – Vector

Смежные вопросы