Вопреки популярной моде на эту тему, есть законные причины проводить различие между публичными, частными и защищенными членами, независимо от того, работаете ли вы в Python или в более традиционной среде ООП. Часто случается так, что вы разрабатываете вспомогательные методы для особенно затянувшейся задачи на некотором уровне специализации объекта. Излишне говорить, что вы действительно не хотите, чтобы эти методы наследовали какой-либо подкласс, потому что они не имеют смысла в специализированном контексте и даже не должны быть видимы; и все же они видимы, и они уменьшают полезность таких вещей, как завершение табуляции, навигаторы объектов и другое системное программное обеспечение, потому что все на всех уровнях абстракции сглаживаются и объединяются. Эти средства программирования не тривиальны, заметьте. Они тривиальны, только если вы студент и любите делать то же самое миллион раз только потому, что учитесь.
Python исторически развивался таким образом, что реализовать различие между публичным и частным стало все труднее из-за идеологической инерции и проблем совместимости. Это простая истина. Для всех было бы настоящей головной болью изменить то, что они делали. Следовательно, теперь у нас есть миллион поклонников Python, и все они читали одну и ту же одну или две оригинальные статьи, однозначно решившие, что различие между общественным и частным является «непифонным». Эти люди, из-за отсутствия критического мышления или справедливости по отношению к широко распространенным, обычным практикам, немедленно используют этот случай, чтобы нарастить предсказуемое множество аппологетик - De Defensione Serpentis - которое, как я подозреваю, возникает не из рационального выбор через pythonis (питонский путь), но из-за пренебрежения другими языками, которые они либо не используют, либо не умеют пользоваться, либо не могут работать из-за работы.
Как кто-то уже сказал, лучшее, что вы можете сделать в Python, чтобы создать эффект, похожий на приватные методы, - это предварительно добавить имя метода к __
(два подчеркивания). С другой стороны, единственное, что достигается, практически говоря, это вставка трансмогрифицированного имени атрибута в __dict__
объекта. Например, скажем, у вас есть следующее определение класса:
class Dog(object):
def __bark(self):
print 'woof'
Если вы запустите dir(Dog())
, вы увидите странного члена по имени _Dog__bark
. На самом деле, единственная причина, по которой существует эта хитрость, заключается в том, чтобы обойти описанную мною проблему, а именно: предотвращение наследования, перегрузку и замену методов super.
Будем надеяться, что в будущем появится некоторая стандартизированная реализация частных методов, когда люди поймут, что ткани не нужно иметь доступ к методам, с помощью которых отдельная клетка реплицирует ДНК, а сознанию необходимо постоянно выяснять, как восстанавливать свои ткани. и внутренние органы.