Частные переменные и методы в Python [дубликат]

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

Который я должен использовать _foo (подчеркивание) или __ панель (двойное подчеркивание) для членов парламента, не занимающих официального поста и методов в Python?

65
задан Community 23 May 2017 в 12:18
поделиться

4 ответа

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

38
ответ дан 24 November 2019 в 15:26
поделиться

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

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

68
ответ дан 24 November 2019 в 15:26
поделиться

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

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

9
ответ дан 24 November 2019 в 15:26
поделиться

Потому что это соглашение о кодировании. См. здесь для получения дополнительной информации.

-4
ответ дан 24 November 2019 в 15:26
поделиться
Другие вопросы по тегам:

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