2016-10-14 5 views
0

私はPythonでsetattr()の簡単なテスト例を設定しようとしていますが、メンバーに新しい値を割り当てることができません。ここで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 

名前だけsetattr関数呼び出しの__barが影響を受けている理由である、識別子ではなく、文字列に適用されます。

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

は期待どおりに動作するはずです。

大文字の二重下線は、通常、ほとんどのPythonコードであまり頻繁には使用されません(その使用は一般的に推奨されないため)。いくつかの有効なユースケースがあります(主にサブクラス化の際にネームの衝突を避けるためです)が、ネームマングリングが一般的に避けられるほど稀です。

関連する問題