Ответ 1
От PEP 8:
_single_leading_underscore
: слабый индикатор "внутреннего использования". Например.
from M import *
не импортирует объекты, имя которых начинается с подчеркивания.
single_trailing_underscore_
: используется по соглашению, чтобы избежать конфликтов с ключевым словом Python, например
Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
: при присвоении имени атрибуту класса вызывается имя (внутри классаFooBar
,__boo
становится_FooBar__boo
, см. ниже).__double_leading_and_trailing_underscore__
: "магические" объекты или атрибуты, которые находятся в управляемых пользователем пространствах имен. Например.__init__
__import__
или__file__
. Никогда не изобретайте такие имена; использовать их только как задокументировано.
Кроме того, от Дэвида Гудгера Код как Pythonista:
Атрибуты:
interface
,_internal
,__private
Но старайтесь избегать формы
__private
. Я никогда не использую его. Доверьтесь мне. если ты используйте его, вы пожалеете об этом позже.Пояснение:
Люди, идущие с фона С++/Java, особенно подвержены чрезмерное использование/неправильное использование этой "функции". Но имена
__private
не работают. так же, как в Java или С++. Они просто запускают имя, которое целью является предотвращение случайных конфликтов пространства имен в подклассах:MyClass.__private
просто становитсяMyClass._MyClass__private
. (Обратите внимание, что даже это ломается для подклассов с тем же именем, что и суперкласса, например. подклассы в разных модулях.) Можно доступ__private
к именам за пределами их класса, просто неудобно и хрупкий (он добавляет зависимость от точного имени суперкласса).Проблема заключается в том, что автор класса может законно думать "это имя атрибута/метода должно быть закрытым, доступным только изнутри это определение класса" и использовать соглашение
__private
. Но позже, пользователь этого класса может сделать подкласс, который законно необходим доступ к этому имени. Так что либо надкласс должен быть изменен (что может быть сложно или невозможно), или код подкласса должен используйте ручные искаженные имена (что в лучшем случае уродливо и хрупко).В Python есть концепция: "Мы все соглашаем взрослых здесь". Если вы используете форму
__private
, с которой вы защищаете атрибут? Подклассы должны использовать атрибуты из суперклассов должным образом, и ответственность за суперклассы правильно документируйте их атрибуты.Лучше использовать соглашение с одним ведущим-подчеркиванием,
_internal
. "Это совсем не имя, а просто указывает на другие, чтобы" быть осторожными с этим, это внутренняя реализация деталь; не трогайте его, если вы не понимаете его полностью ". хотя.