Python "private" имя mangling и экземпляр vs атрибуты класса

Я писал декоратора, который должен получить доступ к частным переменным и нашел это несоответствие. Может кто-нибудь объяснить это?

(Python 2.5)

Управление именами работает как ожидается для атрибутов, определенных в классе:

>>> class Tester(object): ... __foo = "hi" >>> t = Tester() >>> t._Tester__foo 'hi' 

Атрибуты экземпляра не работают (и так мы должны делать это правильно?)

 >>> class Tester(object): ... def __init__(self): ... self.__foo = "hi" >>> t = Tester() >>> t._Tester__foo AttributeError: 'Tester' object has no attribute '_Tester__foo' 

PS Является ли «атрибут класса» правильным словом для них? Они не являются статическими, но если вы сделаете один из них списком или каким-либо другим изменяемым типом, он будет общим …

Обновить

На самом деле, второй пример отлично работает. Это была проблема с оборудованием (перезагрузка помогла).

One Solution collect form web for “Python "private" имя mangling и экземпляр vs атрибуты класса”

На самом деле это неверно.

Манипуляция имени происходит во время создания класса; любые функции, относящиеся к искаженным именам, также корректируются.

Я не могу воспроизвести ваш пример, по крайней мере, не в версиях Python 2.4, 2.5, 2.6, 3.1 и 3.2 на Mac:

 >>> class Tester(object): ... def __init__(self): ... self.__foo = "hi" ... >>> Tester()._Tester__foo 'hi' >>> Tester().__foo Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Tester' object has no attribute '__foo' 

Если вы разобьете байт-код функции, вы увидите, что имя тоже искажено:

 >>> import dis >>> dis.dis(Tester.__init__) 3 0 LOAD_CONST 1 ('hi') 3 LOAD_FAST 0 (self) 6 STORE_ATTR 1 (_Tester__foo) 9 LOAD_CONST 0 (None) 12 RETURN_VALUE 

Я проверил источник компилятора, и все имена запускаются через mangler, путь к коду, который по-прежнему остается неизменным с 2002 года.

И да, атрибуты класса и атрибуты экземпляра являются правильными условиями. Атрибуты класса всегда разделяются, но присваивание атрибуту экземпляра присваивается экземпляру. Мутирование списка или других изменяемых объектов не совпадает с назначением атрибутов.

 
Interesting Posts for Van-Lav

PyQt на Android

«Правильный» способ определения исключения в Python без запроса PyLint

Не удалось прочитать изображение с помощью функции Tensorflow shuffle_batch () в пользовательской функции

Базовая многопроцессорная обработка с циклом while

Вернуть кортеж объектов

Возвращает массив UUID PosgreSQL в виде списка с psycopg2

Ошибка Hmac Hashing в Python 3.5

Проблема с python / pytz Преобразование из локального часового пояса в UTC, затем обратно

Как использовать шаблоны Django, так как без сервера

В python django, как вы распечатываете интроспекцию объекта? Список всех общедоступных методов этого объекта (переменная и / или функции)?

Получить все теги от taggit

Google Cloud Storage + Python: Любой способ перечислить obj в определенной папке в GCS?

отправить активировать электронную почту с django-registration

Как я могу использовать метод Django для метода модели?

Разница в дескрипторе hog, рассчитанная на цветные изображения в Python и C ++

Python - лучший язык программирования в мире.