2016-07-13 17 views
1

に表示する属性を次のpythonの例を考えてみてくださいガイド:はすべて、Pythonの `__dict__`方法

In [3]: class test(object): 
    ...:  attribute='3' 
    ...:  def __init__(self): 
    ...:   self.other='4' 
    ...:   

In [4]: b=test() 

In [5]: b.attribute 
Out[5]: '3' 

In [6]: b.__dict__ 
Out[6]: {'other': '4'} 

なぜそれが__dict__だけ"other"属性ではなく"atribute"を示したということでしょうか?

そして、すべてのクラスとその属性と値を持つ辞書を取得するにはどうすればよいですか?つまり、私はこれをどうやって得るのですか?

{'other': '4', 'attribute': '3'} 

そして、__dict__などの簡単な手段を使用しています。

PS:this questionに関連していますが、そこからはっきりとdictを得ることはできませんでした。

PS2:私は

In [3]: class test(object): 
    ...:  attribute='3' 
    ...:  def __init__(self): 
    ...:   self.other='4' 
    ...:  def _print_atr(self): 
    ...:   # This should print exactly {'other': '4', 'attribute': '3'} 
    ...:   print(self.__all_atr__) 

In [4]: b=test() 

In [5]: b.attribute 
Out[5]: '3' 

In [6]: b.__dict__ 
Out[6]: {'other': '4'} 

乾杯

+0

あなたはPS2の意味を詳しく説明できますか?なぜあなたの仮説 '__all_atr__'は' __init__'と '_print_atr'を除いていますか?_does_は' attribute'を含んでいますか? – mgilson

+0

@mgilsonはい、申し訳ありませんが、それがはっきりしていない場合、それはまさにそれがやることです。私の例外の例を出力します: '{'other': '4'、 'attribute': '3'}'。 – TomCho

+0

しかし_why_?いくつかのものを排除するためのルールとは何かを排除するルールは何ですか? – mgilson

答えて

2

attributeはインスタンス属性ではなくクラス属性です(mappingproxytest.__dict__)。

インスタンスから attributeの値を更新する場合は、インスタンス __dict__attributeを取得することができます

>>> b = test() 
>>> b.__dict__ 
{'other': '4'} 
>>> b.attribute 
'3' 
>>> b.attribute = 5 
>>> b.__dict__ 
{'attribute': 5, 'other': '4'} 

それとも

>>> b.attribute = b.__class__.attribute # may not be necessary 

で元の値を維持するか、あなたがの定義を変更することができますクラスを開き、attributeをクラスメソッドの1つに移動し、self経由でインスタンスにバインドします。

+0

+1この特別な言及について: "インスタンスの属性の値を更新すると、インスタンス__dict__の属性を得ることができます" –

2

b.__dict__は、bの属性のマッピングのみではないとして使用することができます何かを探しています、test.__dict__またはb.__class__.__dict__を探していませんよbのクラス(__init__には存在しないことに注意してください)。 bのクラスの属性はクラスの__dict__にあります。

>>> class test(object): 
... attribute = 1 
... def __init__(self): 
...  self.other = 2 
... 
>>> b = test() 
>>> b.__dict__ 
{'other': 2} 
>>> test.__dict__ 
dict_proxy({'__module__': '__main__', 'attribute': 1, '__dict__': <attribute '__dict__' of 'test' objects>, '__weakref__': <attribute '__weakref__' of 'test' objects>, '__doc__': None, '__init__': <function __init__ at 0x1030f72a8>}) 

あなたは両方をしたい場合は、あなたが何か行うことができます。

d = dict(vars(type(b))) 
d.update(vars(b)) 

を(一部はb.__dict__vars(b)を好むことに注意してください)もちろん、これはサブクラスを取得していません...

サブクラスが必要な場合は、メソッドの解決順序を歩く必要があります。

d = {} 
for cls in type(b).__mro__: 
    d.update(vars(cls)) 
d.update(vars(b)) 
+0

' AttributeError: 'dictproxy'オブジェクトに属性 'update' – TomCho

0

てみタイピング:

test.__dict__ 

そして、それは '属性' とキーを示しています。これは、attributeがインスタンス変数ではないクラス変数であるため、正確に発生します。

+0

Thats 'b .__ class __.__ dict__'と同じですが、それほど大きな助けにはなりません。約5分で私の編集を確認してください – TomCho

関連する問題