При обычном запуске возникнет AttributeError: self.__mangled превращается в self._MangledGlobal__mangled, но такого атрибута экземпляра или класса нет. Одноимённая глобальная переменная не используется.
Какой результат выведет код с применением name mangling?
При обычном запуске возникнет AttributeError: self.__mangled превращается в self._MangledGlobal__mangled, но такого атрибута экземпляра или класса нет. Одноимённая глобальная переменная не используется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод будет получен при выполнении приведённого фрагмента Python, демонстрирующего механизм "name mangling" в классах.
_MangledGlobal__mangled = "A"
class MangledGlobal:
def test(self):
return self.__mangled
assert MangledGlobal().test() == "A"
Ответ
При обычном запуске возникнет AttributeError: self.__mangled превращается в self._MangledGlobal__mangled, но такого атрибута экземпляра или класса нет. Одноимённая глобальная переменная не используется.
Name mangling меняет имя атрибута, но не превращает доступ через self в поиск глобальной переменной. Чтобы assert прошёл, определите __mangled = 'A' внутри класса либо self.__mangled в конструкторе.
В приведённом фрагменте вообще нет print, поэтому успешный assert тоже ничего бы не вывел. При запуске Python с -O инструкция assert удаляется, и вызов test может не произойти вовсе. Это ещё одна причина не помещать необходимые действия программы только внутрь assert.