Возможный дубликат:
Значение одиночного и двойного подчеркивания перед именем объекта в Python
Для чего я должен использовать _foo (подчеркивание) или __bar (двойное подчеркивание) для частных членов и методов в Python?
Возможный дубликат:
Значение одиночного и двойного подчеркивания перед именем объекта в Python
Для чего я должен использовать _foo (подчеркивание) или __bar (двойное подчеркивание) для частных членов и методов в Python?
Обратите внимание, что в Python нет такой вещи, как "частный метод". Двойное подчеркивание - это только название:
>>> class A(object):
... def __foo(self):
... pass
...
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()
Таким образом, префикс __
полезен, когда вам нужно, чтобы возникла манипуляция, например, чтобы не столкнуться с именами вверх или ниже цепочки наследования. Для других целей, одно подчеркивание будет лучше, ИМХО.
EDIT, относительно путаницы на __
, PEP-8 совершенно ясно:
Если ваш класс предназначен для подкласса, и у вас есть атрибуты что вы не хотите использовать подклассы, рассмотрите их двойные ведущие подчеркивания и отсутствие подчеркивания подчеркивания. Это вызывает Алгоритм переименования имен Python, где имя класса искалеченное в имя атрибута. Это помогает избежать имени атрибута столкновения должны подклассы непреднамеренно содержать атрибуты с то же имя.
Примечание 3: Не все любят манипулирование именами. Попробуйте сбалансировать необходимо избегать случайных конфликтов имен с потенциальным использованием продвинутых абонентов.
Итак, если вы не ожидаете, что подкласс случайно переопределит собственный метод с тем же именем, не используйте его.
Двойное подчеркивание. Он управляет именем таким образом, что к нему нельзя получить доступ просто через __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), только измените это, если вы абсолютно должны ") и удвоитесь для полностью закрытого.
Потому что это соглашение о кодировании. Подробнее см. здесь.