Двойные подчеркивания не делают «частным» членом в смысле C++ или Java. Python явно скрывает такие правила доступа к языку. A single подчеркивает, по соглашению, отмечает атрибут или метод как «деталь реализации» - то есть вещи, которые все еще могут получить к нему, но это не поддерживаемая часть интерфейса класса и, следовательно, гарантии, которые класс может сделать относительно инвариантов или обратно/вперед совместимость, больше не применяются. Это решает ту же концептуальную проблему, что и «частный» (разделение интерфейса и реализация) по-другому.
Дважды подчеркивает взывать имя коверкая, который до сих пор не является «частным» - это всего лишь немного сильнее формулировка выше, в результате чего: - Эта функция является деталью реализации этого класса, но - Подклассы может разумно ожидать, чтобы иметь метод с тем же именем, что не означает как перегруженной версии оригинального
Это занимает немного языковой поддержки, в результате чего __name
будет наломать включать имя класса - так что подклассные версии получат разные имена вместо переопределения. До сих пор вполне возможно, чтобы подкласс или внешний код вызывали этот метод, если он действительно хочет, - и цель аннулирования имени явно не, чтобы предотвратить это.
Но из всего этого, «защищенный», оказывается, не имеет большого смысла в Python - если вы действительно есть метод, который может нарушить инвариантами , если не называется подклассом (и, реально, вы, вероятно, дон даже если вы думаете, что это так), Путь Python - это просто документ. Поместите примечание в свою docstring к действию «Предполагается, что он вызывается только подклассами» и выполняется с предположением, что клиенты будут поступать правильно, потому что, если они этого не делают, это становится их собственной проблемой.
No can can. Используйте соглашение '_single_underscore' и будьте счастливы. – JBernardo