Являются ли переменные / методы с именами, начинающимися с подчеркивания, внутренними или защищенными? - PullRequest
0 голосов
/ 18 февраля 2019

Рассмотрим следующий фрагмент:

class MyClass:
    def __init__(self, i):
        self._i = i

    def _print(self):
        print(self._i)


my_obj = MyClass(5)

print(my_obj._i)
my_obj._print()

Является ли MyClass._i и MyClass._print защищенной или внутренней переменной?

Согласно официальным документам Python, Классы § ЛичныеПеременные :

существует соглашение, которому следует большая часть кода Python: имя с префиксом подчеркивания (например, _spam) следует рассматривать как непубличную часть API (независимо от того, является лиэто функция, метод или элемент данных).Он должен рассматриваться как деталь реализации и может быть изменен без предварительного уведомления.

Итак, как я понимаю эти документы, перед именем подчеркивания подразумевается «внутренний»: предназначенный для использования пакетомэто определено в этом пакете, а не вне его.И приведенный выше фрагмент корректен.

Однако: PyCharm выдает предупреждения, если я открываю приведенный выше фрагмент:

Access to a protected member _i of a class

Access to a protected member _print of a class

Почему «защищен»?

Я что-то упустил?Есть ли соглашение, о котором я не знаю, которое требует, чтобы я предпринял дополнительные шаги, чтобы различать защищенное и внутреннее?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы сказали в вопросе:

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

Обычно «внутренние» или «защищенные» атрибуты или методы класса предназначены для использования только этим классом , даже вне классаво всем пакете / модуле.

Атрибуты и функции модуля: да, они предназначены для использования только внутри модуля.

Именно поэтому вы получаете предупреждения;соглашение еще более ограничено, чем вы думаете.


Скрипт будет работать независимо от того, "защищенные" или "внутренние" переменные и методы являются просто соглашением.

...