Члены парламента, не занимающие официального поста в Python

Как я могу сделать методы и элементы данных частными в Python? Или разве Python не поддерживает членов парламента, не занимающих официального поста?

61
задан smci 1 June 2018 в 08:46
поделиться

4 ответа

Если имя функции Python, метод класса или атрибут начинается с (но не заканчивается) двумя подчеркивает, это личное; все остальное является публичным. У Python нет концепции методов защищенного класса (доступно только в собственном классе и потомке классы). Методы классов: частные (доступные только в своих собственных класс) или общедоступный (доступен из где угодно).

Погружение в Python

-121--943583-

9,6. Частные переменные

«Частные» переменные экземпляра, невозможно получить доступ, кроме как изнутри объект, не существует в 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 .

77
ответ дан 24 November 2019 в 17:11
поделиться

Если имя функции Python метод класса или атрибут начинается с (но не заканчивается) два подчеркивает, это частное; все еще публичная. У питона нет концепции охраняемых методов классов (доступных только в своем классе и потомке классы). Методы класса либо частное (доступно только самостоятельно класс) или общественности (доступно от везде).

Погрузиться в Python

6
ответ дан 24 November 2019 в 17:11
поделиться

Другие ответы предоставляют технические детали. Я хотел бы подчеркнуть разницу в философии между Python с одной стороны и языками, такие как C ++ / Java (которая я предполагаю, что вы знакомы с вашим вопросом).

Общее отношение в Python (и Perl для этого материи) заключается в том, что «конфиденциальность» атрибута является запрос на программист, а не забор колючей проволоки компилятором / интерпретатором. Идея хорошо обобщена в этой почте и часто называют «мы все согласиемся взрослыми», поскольку он «предполагает», что программист несет достаточно, чтобы не вмешиваться со своими внушательствами. Ведущие подчеркивания служат вежливым сообщением, говорящим, что атрибут является внутренним.

С другой стороны, если вы DO хотите получить доступ к внутренним ценам для некоторых приложений (заметным примером - это генераторы документации, такие как PYDOC), вы можете сделать это. Onus находится на вас, как программист, чтобы знать, что вы делаете, и делаете это правильно, а не на языке, чтобы заставить вас делать с вещами , это .

34
ответ дан 24 November 2019 в 17:11
поделиться

Это звучит как одноразовая проблема. Я предлагаю вам использовать SVN diff> /to/some/file.patch (или нормальный diff), чтобы сохранить его изменения в файл, а затем применить его на перемещенном багажнике с Patch -P0 /to/some/file.path.

-121--2281858-

. Нет частных любого другого механизмов защиты доступа в Python. Существует конвенция, задокументированная в руководстве Руководство по стилю Python для указания пользователей вашего класса, что они не доступа к определенному атрибуту.

  • _single_leading_underscore: слабый «внутренний использование» индикатор. Например. Из M импорта * не импортирует объекты, имя которых начинается с подчеркивания.

  • Single_Trailing_underscore_: используется Конвенцией, чтобы избежать конфликтов с ключевым словом Python E.g. TKinter.toplevel (Master, Class _ = 'Classname')

  • __ double_leading_underscore: при названии атрибута класса вызывает имя поклонения (внутри класса FOOBAR, __BOO становится _foobar__Boo; см. Ниже).

6
ответ дан 24 November 2019 в 17:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: