Получить факты _ и __ довольно легко; другие ответы выражают их довольно хорошо. Использование намного сложнее определить.
Вот как я это вижу:
_
Должен использоваться для указания того, что функция не предназначена для публичного использования, как, например, API. Это и ограничение импорта делают его похожим на internal
в c #.
__
Следует использовать, чтобы избежать коллизии имен в иерархии наследования и избежать позднего связывания. Очень похоже на приват в c #.
==>
Если вы хотите указать, что что-то не для публичного использования, но должно действовать как protected
, используйте _
.
Если вы хотите указать, что что-то не для публичного использования, но должно действовать как private
, используйте __
.
Это тоже цитата, которая мне очень нравится:
Проблема в том, что автор класса может на законных основаниях думать, "это
имя атрибута / метода должно быть приватным, доступным только изнутри
это определение класса "и использовать соглашение __private. Но позже,
пользователь этого класса может сделать подкласс, который законно нуждается
доступ к этому имени. Так что либо суперкласс должен быть модифицирован
(что может быть трудным или невозможным), или код подкласса должен
используйте искаженные вручную имена (в лучшем случае уродливые и хрупкие).
Но проблема в том, что, по моему мнению, если нет среды IDE, которая предупреждает вас при переопределении методов, обнаружение ошибки может занять некоторое время, если вы случайно переопределили метод из базового класса.