Как я могу сделать методы и элементы данных частными в Python? Или разве Python не поддерживает членов парламента, не занимающих официального поста?
-121--943583-Если имя функции Python, метод класса или атрибут начинается с (но не заканчивается) двумя подчеркивает, это личное; все остальное является публичным. У Python нет концепции методов защищенного класса (доступно только в собственном классе и потомке классы). Методы классов: частные (доступные только в своих собственных класс) или общедоступный (доступен из где угодно).
«Частные» переменные экземпляра, невозможно получить доступ, кроме как изнутри объект, не существует в Python. Тем не менее, существует конвенция, которая за которым следует большинство кодов Python: имя с префиксом подчеркивания (например, _spam) следует рассматривать как непубличную часть API (независимо от того, является ли она - функция, метод или данные член). Его следует считать детализация реализации и подчинение изменение без уведомления.
Поскольку существует действительный сценарий использования для члены класса-рядовой (а именно, чтобы избежать конфликты имен с именами определяется подклассами), существует ограниченная поддержка такого механизма, называется имя искажения. Любой идентификатор формы __ спама (не менее двух ведущие подчеркивания, не более одного заключительное подчеркивание) текстуально заменен на
_ имя класса __ спам
, где classname - имя текущего класса с разделенным ведущим подчеркиванием (ами). Это искажения делается без учета в синтаксическую позицию идентификатор, если он имеет место в определении класса.
Таким образом, , например, ,
class Test:
def __private_symbol(self):
pass
def normal_symbol(self):
pass
print dir(Test)
будет выводиться:
['_Test__private_symbol',
'__doc__',
'__module__',
'normal_symbol']
__ private _ symbol
должен считаться частным методом, но он по-прежнему будет доступен через _ Test __ private _ symbol
.
Если имя функции Python метод класса или атрибут начинается с (но не заканчивается) два подчеркивает, это частное; все еще публичная. У питона нет концепции охраняемых методов классов (доступных только в своем классе и потомке классы). Методы класса либо частное (доступно только самостоятельно класс) или общественности (доступно от везде).
Другие ответы предоставляют технические детали. Я хотел бы подчеркнуть разницу в философии между Python с одной стороны и языками, такие как C ++ / Java (которая я предполагаю, что вы знакомы с вашим вопросом).
Общее отношение в Python (и Perl для этого материи) заключается в том, что «конфиденциальность» атрибута является запрос на программист, а не забор колючей проволоки компилятором / интерпретатором. Идея хорошо обобщена в этой почте и часто называют «мы все согласиемся взрослыми», поскольку он «предполагает», что программист несет достаточно, чтобы не вмешиваться со своими внушательствами. Ведущие подчеркивания служат вежливым сообщением, говорящим, что атрибут является внутренним.
С другой стороны, если вы DO хотите получить доступ к внутренним ценам для некоторых приложений (заметным примером - это генераторы документации, такие как PYDOC), вы можете сделать это. Onus находится на вас, как программист, чтобы знать, что вы делаете, и делаете это правильно, а не на языке, чтобы заставить вас делать с вещами , это .
Это звучит как одноразовая проблема. Я предлагаю вам использовать SVN diff> /to/some/file.patch
(или нормальный diff), чтобы сохранить его изменения в файл, а затем применить его на перемещенном багажнике с Patch -P0 /to/some/file.path
.
. Нет частных
любого другого механизмов защиты доступа в Python. Существует конвенция, задокументированная в руководстве Руководство по стилю Python для указания пользователей вашего класса, что они не доступа к определенному атрибуту.
_single_leading_underscore: слабый «внутренний использование» индикатор. Например. Из M импорта *
не импортирует объекты, имя которых начинается с подчеркивания.
Single_Trailing_underscore_: используется Конвенцией, чтобы избежать конфликтов с ключевым словом Python E.g. TKinter.toplevel (Master, Class _ = 'Classname')
__ double_leading_underscore: при названии атрибута класса вызывает имя поклонения (внутри класса FOOBAR, __BOO становится _foobar__Boo; см. Ниже).