В этой теме есть много хороших ответов, но вот несколько практичный ответ с практической точки зрения:
Вам нужно необходимо избегать большого количества частных членов из открытых API, intellisense, документов, import *
и т. Д. Поэтому всегда присоединяйте _ или __ к этим членам.
Большой вопрос: должно ли это быть _ или __? Цель ООП purist - всегда присоединять __ к закрытым членам и _ для защищенных методов. __ делает имя искажения и затрудняет использование таких вещей, как setattrib, тестовые среды и снижает удобочитаемость. Поэтому я лично стараюсь избегать __ как можно больше и использовать _ для частных пользователей.
Но как насчет защищенных членов, которые мы хотим, чтобы производный класс использовал, но не как публичный API. Я предпочитаю не использовать подчеркивание вообще. Это позволяет этим членам получать публичные документы. Затем мы полагаемся на docstring, чтобы сообщить пользователю, что это защищенные члены, например:
class Class1:
def _private1():
pass
def protected1():
"""(for derived classes) Does XYZ."""
pass
def public1()
pass