2016-08-11 12 views
2

次のコードはエラーを示していません。二重アンダースコアを使用した変数名の不思議な動作

class Bar(): 
    pass 

class Foo(): 
    def __init__(self): 
     self.__bar = Bar() 

    def get_bar(self): 
     return self.__bar 

foo = Foo() 
bar1 = foo.get_bar() 

foo.__bar = Bar() 
bar2 = foo.get_bar() 

assert (bar1 is bar2) 

なぜ__barはシングルトンのように機能しますか?

答えて

4

二重のアンダースコアのためare magical:Pythonはこれらの名前を変更して、クラスの外部からアクセスできないようにします。

あなたは...

foo._Foo__bar = Bar() 
bar2 = foo.get_bar() 

assert (bar1 is bar2) 

であなたの例の最後の3行を交換した場合...あなたは、あなたが期待する行動を見るでしょう。

+0

または 'self .__ foo'を設定する' set_bar'メソッドを実装した場合。 –

+0

Danielが彼のコメントで言ったことを強調するために、 'set_bar'メソッドを実装するのが正しい方法です。この回答の例は、名前のマングリングを示すためのものでした。 – larsks

関連する問題