2016-05-01 3 views
1

Чтение this question on method ordering, я подумал о том, где разместить защищенные методы и должны ли они быть приватными _method(self) или public method(self) в Python. Я знаю, что Python не предоставляет языковой функции для защищенных методов.Как представить защищенные методы в классах Python?

  • Private: По соглашению, атрибуты, начинающиеся с подчеркивания являются частными. Их обычно можно получить извне, но не следует. Запуск защищенных методов с подчеркиванием кажется странным, поскольку неясно, что подкласс фактически переопределяет метод, а не декларирует его собственную деталь реализации.

  • Публикация: Без подчеркивания более вероятно, что кто-то взглянет на базовый класс, чтобы узнать, существует ли этот метод. Таким образом, это лучше для людей, которые являются подклассами. Тем не менее, люди, которые хотят использовать подкласс, не знают, что этот метод является только деталью реализации и может попытаться вызвать его извне.

Каков предпочтительный способ определения защищенных методов в Python?

+1

Также см. [Почему «частные» методы Python не являются частными?] (Http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private) Как сказал Гвидо : «Мы все соглашаем взрослых здесь». –

ответ

2

Просто используйте имена, начинающиеся с одного символа подчеркивания.

Защищенный метод - это деталь реализации, которую вы хотите разделить с подклассами, поэтому такие методы не являются частью общедоступного API. Все, что не является частью общедоступного API, лучше всего назвать с начальным подчеркиванием.

Другими словами, «защищенный» следует рассматривать так же, как «частный». Защищенные методы должны существовать только на языке со строгой моделью конфиденциальности, в результате чего такие детали реализации частного доступа препятствуют совместному использованию таких методов с подклассами. У Python такой проблемы нет.

Что бы вы ни делали, не использовать ведущую двойной подчеркивание; такие имена считаются классом private и являются именами, которые относятся к классу, который их определяет (они переименовываются компилятором путем префикса _ClassName спереди), чтобы гарантировать, что подклассы не случайно перезаписывают их.