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

Обновить

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

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

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

Я не могу воспроизвести ваш пример, по крайней мере, не в версиях 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 года.

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