Возможный дубликат:
Значение сингла - и двойное подчеркивание перед именем объекта в PythonКоторый я должен использовать _foo (подчеркивание) или __ панель (двойное подчеркивание) для членов парламента, не занимающих официального поста и методов в Python?
Двойное подчеркивание. Он искажает имя таким образом, что к нему нельзя получить доступ просто через __ fieldName
извне класса, с чего вы хотите начать, если они должны быть закрытыми. (Хотя получить доступ к полю все еще не очень сложно.)
class Foo:
def __init__(self):
self.__privateField = 4;
print self.__privateField # yields 4 no problem
foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'
Вместо этого оно будет доступно через _Foo__privateField
. Но он кричит: «Я ЧАСТНЫЙ, НЕ ПРИКАСАЙТЕСЬ ко мне», что лучше, чем ничего.
Обратите внимание, что в Python нет такого понятия, как «частный метод». Двойное подчеркивание - это просто искажение имени:
>>> class A(object):
... def __foo(self):
... pass
...
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()
Поэтому префикс __
полезен, когда вам нужно, чтобы произошло искажение, например, чтобы не конфликтовать с именами вверх или вниз цепочки наследования. Для других целей было бы лучше использовать одиночное подчеркивание, ИМХО.
РЕДАКТИРОВАТЬ, относительно путаницы с __
, PEP-8 довольно ясно говорит об этом:
Если ваш класс предназначен для подкласса, и у вас есть атрибуты что вы не хотите, чтобы подклассы использовались, рассмотрите возможность наименования их с двойные подчеркивания в начале и без подчеркивания в конце. Это вызывает Алгоритм изменения имени Python, где имя класса исказил имя атрибута. Это помогает избежать имени атрибута коллизии должны подклассы непреднамеренно содержать атрибуты с то же имя.
Примечание 3: Не всем нравится искажать имена.Попытайтесь сбалансировать необходимо избегать случайного совпадения имен с потенциальным использованием продвинутые абоненты.
Поэтому, если вы не ожидаете, что подкласс случайно переопределит собственный метод с тем же именем, не используйте его.
Двойное подчеркивание. Это искажает имя. К переменной все еще можно получить доступ, но, как правило, это плохая идея.
Используйте одинарные символы подчеркивания для полуприватных (говорит разработчикам python «меняйте это только в случае крайней необходимости») и удваивайте для полностью приватных.
Потому что это соглашение о кодировании. См. здесь для получения дополнительной информации.