Какой результат выведет код с применением name mangling?

При обычном запуске возникнет AttributeError: self.__mangled превращается в self._MangledGlobal__mangled, но такого атрибута экземпляра или класса нет. Одноимённая глобальная переменная не используется.

Короткий ответ

Что ответить на собеседовании

При обычном запуске возникнет 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее