Если «явный лучше, чем неявный», то почему в Python нет явных модификаторов доступа: Public, Protected, Private и т. Д.?
Я знаю, что идея заключается в том, что программист должен знать, что делать с помощью подсказки - не нужно использовать «грубую силу». Но IMO «Инкапсуляция» или «сокрытие информации» - это не просто удержание людей, это вопрос организации и структуры: ваши уровни разработки должны иметь самоопределяющиеся, четко разграниченные области и границы, как это делают физические системы.
Может кто-нибудь, пожалуйста, помогите мне с ясным объяснением того, почему ограничения доступа подразумеваются, а не явны в Python, языке, который в других отношениях кажется близким к идеальному?
Изменить: Пока я видел 3 предложенных ответа, и я понял, что есть 2 части на мой вопрос:
Почему нет ключевых слов, например
private def myFunc(): dostuff....
вместо ИМО уродливые и трудные для подчеркивания. Но это не важный момент.
Важнее:
Почему эти модификаторы доступа являются «рекомендациями» или подсказками и не применяются. Это будет трудно изменить позже? Очень просто изменить «защищенный» на «общедоступный» - и если у вас сложная цепочка наследования, которая усложняет процесс, у вас плохой дизайн - ваш дизайн должен быть усовершенствован, а не полагаться на языковую функцию, которая облегчает написание плохо структурированный код
Когда применяются модификаторы доступа, ваш код автоматически разделяется - вы ЗНАЕТЕ, что определенные сегменты находятся вне области видимости, поэтому вам не нужно иметь с ними дело, за исключением случаев, когда это необходимо. И, если ваш дизайн не подходит, и вы обнаруживаете, что постоянно перемещаете вещи в разные области видимости, язык может помочь вам привести себя в порядок.
Столько, сколько я люблю Python, я считаю, что этот второй пункт является серьезным недостатком. И мне еще предстоит увидеть хороший ответ на это.
источник
private def whatever
том, чтоclass x: def whatever(self): pass
это сокращениеclass x: pass; x.whatever = lambda self: pass
, поэтому в основном вам понадобится частный модификатор для назначенияОтветы:
«Явное лучше, чем неявное» - это только одна из максим в философии дизайна Python. «Простое лучше, чем сложное». И, хотя это не в дзен Python, «мы все здесь взрослые по обоюдному согласию» - это другое.
Это второе правило, пожалуй, самое важное здесь. Когда я разрабатываю класс, у меня есть представление о том, как он будет использоваться. Но я не могу предсказать все возможные варианты использования. Это может быть , что некоторые используют будущее моего кода требуется доступ к переменным я думал , как частные. Почему я должен затруднять (или даже вообще невозможен) доступ к ним, если они нужны будущему программисту (или даже мне)? Лучше всего пометить их предупреждением - как отмечает Джунас, единый префикс подчеркивания является стандартом - что они являются внутренними и могут измениться; но запрещать доступ вообще кажется ненужным.
источник
Я подозреваю, что основной причиной отсутствия модификаторов доступа является простота
Как вы говорите, речь идет не о том, чтобы не пускать людей, а об организации, поэтому основной смысл «частного» заключается в том, что он отправляет сообщение пользователям вашего API «пожалуйста, не пишите код, который зависит от этого».
Легко сказать «по соглашению, _x или __x не должны использоваться вне класса», но в динамической объектной модели python было бы трудно даже придумать нотацию.
как отметить доступность?
Я думаю, это был компромисс. Если вы строго не можете с этим жить, я бы предложил ruby, который имеет аналогичный уровень абстракции и динамичности, но имеет объектную модель, которая позволяет модифицировать доступ.
источник
__x__
это «магия» (т. е. методы, вызываемые для включения языковой интеграции, такие как перегрузка операторов, итеративность и т. д.). Конвенция есть_x
.__init__
было случайным. В этом примере устанавливаются некоторые свойства объекта, которые не известны во время компиляции, поэтому явный модификатор доступа вам не поможет.Соглашение Python заключается в использовании префикса подчеркивания для защищенных / закрытых членов.
Это соглашение, если за ним следует, фактически такой же , как модификаторы доступа, за исключением 1) вы будете видеть непосредственно от участника имени , будь то государственные или нет, и 2) вы можете сломать «инкапсуляция» , если вы действительно хотите (это может быть оправдано например, в тестировании; в некоторых других языках вам придется использовать отражение == больше кода).
В конечном счете, это вопрос вкуса, но если вы можете сделать то же самое (с немного большей гибкостью) без специальных ключевых слов, язык будет меньше, а код будет более кратким, что, как правило, хорошо.
источник