__name
фамилии класс частный; такие имена имеют префикс во время компиляции с другим символом подчеркивания и именем класса. Цель состоит в том, чтобы защитить имена от случайных столкновений с именами, используемыми в подклассах. Этими именами являются , а не, предназначенные для частных лиц.
Цитируя Reserved classes of identifiers section:
__*
имена классов-частного. Имена этой категории, используемые в контексте определения класса, переписываются для использования искаженной формы, чтобы избежать столкновений имен между «частными» атрибутами базового и производного классов.
и Identifiers (Names) section:
Личное имя коверкая: Когда идентификатор, который текстуально происходит в определении класса начинается с двух или более символов подчеркивания и не заканчивается в двух или более символов подчеркивания, его считается частным именем этого класса. Частные имена преобразуются в более длинную форму до того, как для них генерируется код. Преобразование вставляет имя класса, с удалением ведущих подчеркиваний и добавлением одного подчеркивания перед именем. Например, идентификатор __spam
, происходящий в классе с именем Ham
, будет преобразован в _Ham__spam
. Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор.
Что происходит в вашем случае является то, что exec()
откладывает компиляцию, эффективно компиляции этот вызов в изоляции. Контекст класса ушел, так что никаких изменений не происходит.
Таким образом, вы должны применить автоматическую предваряя вручную:
exec('self.a = self._A__funct()')
Если вы используете Python 3, вы можете использовать __class__
закрытия normally available for the super()
function доступ к имени класса в настоящее время метод определяется для:
exec('self.a = self._{0.__name__}__funct()'.format(__class__))
Теперь, если вы фактически не планируете, чтобы ваш класс был широко подклассифицирован в стороннем коде, который не должен беспокоиться о случайном столкновении с внутренними деталями реализации, вы не должны использовать double-u nderscore имена вообще. Придерживайтесь имен с одним подчеркиванием.
Обратите внимание, что имена '__' - ** class ** private. Это не то же самое, что и модели конфиденциальности на других языках. –