Перенос имен для имен, начинающихся с __
внутри класса, реализуется путем переписывания этих имен в искаженную форму, ТОЛЬКО внутри класса.Таким образом, ваш Foo.__is
внутри класса заменяется на _Foo__is
, который теперь присутствует в классе __dict__
.Этот атрибут доступен как внутри, так и за пределами класса, поэтому нет частной защиты.Но после замены имя __is
нигде не существует (я думаю), поэтому оно не работает извне.
Из справки Python:
"__ *"Классно-частные имена.Имена в этой категории, когда они используются в контексте определения класса, переписываются для использования искаженной формы, чтобы помочь избежать столкновения имен между «частными» атрибутами базового и производного классов.Смотрите раздел Идентификаторы (Имена).
Также смотрите мой комментарий к ошибкам в вашем фрагменте кода.