2012-06-01 4 views
1

Если я использую одно знаковое подчеркивание для атрибута в классе, было бы ошибкой обращаться к нему с другого объекта? Является ли одно подчеркивание «Я буду использовать это, как мне заблагорассудится, но вы не должны его трогать», или даже разработчик относится к нему так, как если бы он был закрыт?Должен ли я рассматривать свои собственные одиночные атрибуты как частные?

ответ

1

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

Причина в том, что каждый раз, когда вы что-то делаете с этим, вы создаете зависимость между внутренними объектами и где вы кодируете, будь то другая часть того же объекта или модуля или что-то еще. Чем больше этого будет, тем сложнее будет поддерживать или улучшать вещи.

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

Создание интерфейса для выполнения операций, связанных с внутренними деталями, часто означает необходимость разработки и реализации большего количества кода, чем это не было бы. Поэтому в каждом случае выгоды должны быть сопоставлены с затратами, чтобы определить, стоит ли это. В конечном итоге опыт (и образование, если он продолжается) делает такие решения легче, возможно, даже инстинктивными.

+0

Я думаю, что это то, что я обычно делаю. Обычно я никогда не нарушаю инкапсуляцию таким образом, но в этом случае мой код будет намного сложнее, поэтому я получаю доступ к атрибуту с одним подчеркиванием вне класса. –

+0

@MikeVella: Все в порядке, я не говорю, что никто никогда не должен этого делать, только то, что различные компромиссы рассматриваются (и понимаются) в контексте того, что вы делаете. Кроме того, Python позволяет немного легче, чем некоторые языки, возвращаться позже и модифицировать что-то - добавлением дескрипторов, например. – martineau

6

Подчеркнутое подчеркивание означает, что оно не для общественное потребление; код в том же пакете можно ткнуть и подталкивать.

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