2011-08-06 9 views
1

クラスから__variablesにアクセスしようとすると、パーサーは2つのアンダースコアが現在のクラスに対してプライベートであるとみなします。無関係の関数が "private"変数を取得する方法に注目してください。クラス変数ではないPythonプライベートクラス変数

これはバグですか?

 
>>> def f(): pass 
... 
>>> class A: 
...  def g(self): 
...    f.__x = 1 
...    def h(): 
...      pass 
...    h.__y = 2 
...    return h 
... 
>>> z = A().g() 
>>> dir(z) 
['_A__y', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get_ 
_', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new 
__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_ 
closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 
'func_name'] 
>>> dir(f) 
['_A__x', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get_ 
_', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new 
__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_ 
closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 
'func_name'] 
のPython 2.5でテスト

3.2

+0

期待どおりに動作します。確かに、彼らと一緒にやっていることは普通ではありませんが、それらの属性はどこにいてもクラスに属します。 – kwatford

答えて

1

これはwell documented behaviorあります。

このマングリングは、クラスの定義内で発生する限り、識別子の構文上の位置に関係なく行われます。

+0

これは、クラス定義の外側のどこからでもf .__ xを定義するとうまくいきます。だから、 "f"はプライバシーを持っていません(すでに他の回答が削除されているなど)。クラス内からは、これらの変数にアクセスできません(getattr/setattrは無視します)。 – ubershmekel

+1

申し訳ありませんが、どのような種類の変数にアクセスできますか? '__'で始まる変数は?私はクラス定義の外で 'f .__ x 'に値を代入するのは間違いであると言います。単一のアンダースコアで変数を「プライベート」としてマークできます。名前のマングリングの目的は、クラスの継承のコンテキストではプライバシーだけでなく衝突の回避です。 – senderle

+0

これらの事実によると、はい、クラス外の二重アンダースコアを使用するのは間違いであることに同意します。私にとって驚くべき結論に過ぎません。 – ubershmekel

関連する問題