2016-10-14 3 views
0

Я пытаюсь настроить простой пример теста setattr() в Python, но он не может назначить новое значение члену.Python setattr() не присваивает значение члену класса

class Foo(object): 
    __bar = 0 
    def modify_bar(self): 
     print(self.__bar) 
     setattr(self, "__bar", 1) 
     print(self.__bar) 

Здесь я попытался назначение переменной с setattr(self, "bar", 1), но неудачно:

>>> foo = Foo() 
>>> foo.modify_bar() 
0 
0 

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

ответ

0

Ведущий двойной знак подчеркивания вызывает python name-mangling.

Итак:

class Foo(object): 
    __bar = 0 # actually `_Foo__bar` 
    def modify_bar(self): 
     print(self.__bar) # actually self._Foo__bar 
     setattr(self, "__bar", 1) 
     print(self.__bar) # actually self._Foo__bar 

Название коверкая только относится к идентификаторам, а не строк, которые почему __bar в вызове функции setattr не влияет.

class Foo(object): 
    _bar = 0 
    def modify_bar(self): 
     print(self._bar) 
     setattr(self, "_bar", 1) 
     print(self._bar) 

должно работать должным образом.

Лидирующие двойные символы подчеркивания обычно не используются очень часто в большинстве кодов python (поскольку их использование обычно не рекомендуется). Существует несколько действительных случаев использования (главным образом, чтобы избежать конфликтов имен при подклассификации), но они достаточно редки, что, как правило, избегают манипуляции именами в дикой природе.