P
Python Заметки
@pythonotes2.5K подп.
1.1Kпросмотров
41.8%от подписчиков
26 января 2026 г.
Score: 1.2K
Не запуская код определите, что покажет терминал если выполнить следующее: _Ab = 'c' class A: def get(self): return b print(A().get()) Ответ: Несмотря на то, что ваш IDE покажет ошибку, ошибки не будет. Распечатается "c" Объяснение: 1. Mangling За это отвечает механизм mangling - искажение имени. Так работают приватные атрибуты классов. При создании атрибута по правилу: минимум 2 "_" в начале и максимум 1 "_" в конце" имя автоматически становится вида _{classname}{attr} В нашем случае атрибутов класса не создается, но это не отменяет Mangling при обращении к другим объектам внутри класса. 2. Обращение к атрибуту Когда внутри класса происходит обращение к любому объекту с именем по указанному выше правилу, его имя на уровне байт кода также преобразуется. 3. Поиск Далее происходит поиск такой переменной по неймспейсам в порядке LEGB - Local, Enclosing, Global, Built-in. И не трудно догадаться что мы находим нужный атрибут в Global, В итоге получаем результат! Проверить можно так: import dis dis.dis(A.get) # 4 RESUME 0 # # 5 LOAD_GLOBAL 0 (_A__b) # RETURN_VALUE Либо удалите переменную _A__b и запустите еще раз, поулчите ошибку: NameError: name '_A__b' is not defined Как думаете, это норма или баг? #tricks
1.1K
просмотров
1276
символов
Нет
эмодзи
Нет
медиа

Другие посты @pythonotes

Все посты канала →
Не запуская код определите, что покажет терминал если выполн — @pythonotes | PostSniper