Как я понял, в Python, protected
значение объявляется одним _
вначале, а private
двумя — __
. Не понятно то, зачем питон выводит protected
значение, ведь оно должно быть доступно только у себя и у наследуемых классов, не?
class Make(): _foo = "Protect <--"; def fun(): pass class MakeTwo(Make): def off(self): print(self._foo); t = Make(); print t._foo; # Protect <--
Дело в том, что в Python по факту нет ни private, ни protected полей в классах. Использование знака подчёркивания лишь сообщает пользователям кода о том, что использовать это поле вне класса не стоит, но доступ всё равно имеется.
It should be considered an implementation detail and subject to change without notice.
Так называемые private поля на самом деле тоже доступны снаружи класса. Если используется имя поля A.__field
, то (в CPython), если у нас есть экземпляр этого класса a
, к этому полю __field
можно будет обратиться следующим образом: a._A__field
.