Подтвердить что ты не робот

Частные переменные и методы в Python

Возможный дубликат:
Значение одиночного и двойного подчеркивания перед именем объекта в Python

Для чего я должен использовать _foo (подчеркивание) или __bar (двойное подчеркивание) для частных членов и методов в Python?

4b9b3361

Ответ 1

Обратите внимание, что в 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: Не все любят манипулирование именами. Попробуйте сбалансировать необходимо избегать случайных конфликтов имен с потенциальным использованием продвинутых абонентов.

Итак, если вы не ожидаете, что подкласс случайно переопределит собственный метод с тем же именем, не используйте его.

Ответ 2

Двойное подчеркивание. Он управляет именем таким образом, что к нему нельзя получить доступ просто через __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. Но он кричит: "Я ЧАСТНЫЙ НЕ СКАЗАЛ МЕНЯ", что лучше, чем ничего.

Ответ 3

Двойное подчеркивание. Это изменяет имя. Доступ к переменной можно получить, но, как правило, это плохая идея.

Используйте одиночные подчеркивания для полу-частных (говорит разработчикам python), только измените это, если вы абсолютно должны ") и удвоитесь для полностью закрытого.

Ответ 4

Потому что это соглашение о кодировании. Подробнее см. здесь.