2011-01-18 12 views
15

オブジェクトのインスタンス変数のリストにアクセスするには、myObject.__dict__.keys()を呼び出します。この属性を使用して、オブジェクトのすべてのインスタンス変数を出力します。 __dict__は「秘密」属性なので、私はこれをすることを躊躇しています。私は何を意味するのか分かりません。this footnote__dictでPythonインスタンス変数にアクセス__-間違っていますか?

myObject.__dict__を使用するのは間違っていますか?

+4

'?vars(myObject)'が文体的に好きかもしれませんが、それはあなたの質問とは正反対です。それは同じ__dict__を与えます。 –

答えて

6

脚注の意味は、__dict__に直接アクセスするのではなく、必要な機能や動作が利用可能かどうかを確認することです。

ので、代わりのようなものやって:

if "__some_attribute__" in obj.__dict__: 
    # do stuff 

をあなたの代わりに行う必要があります。

try: 
    obj.some_action_i_want_to_do(...) 
except AttributeError: 
    # doesn't provide the functionality I want 

異なるオブジェクトが特定のアクションに異なる内部リファレンスを提供しますが、まだ提供することがありますので、その理由があります所望の出力。

現在のオブジェクトをデバッグしたり検査したりするために "内部"を表示する場合は、dir()が適切です。

+0

しかし、 'dir()'は名前だけを与えます。 '__dict__'はオブジェクト自体も与えます。 –

4

dir関数を使用して、オブジェクトのすべての属性をリストすることができます。

-2

この脚注によれば、__dict__はモジュールオブジェクト上にのみ存在します。

あなたが探しているのはおそらく内蔵のdir()です。例:

>>> f = open('foo', 'w') 
>>> dir(f) 
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines'] 
+0

'__dict__' *はモジュールとは別のものには存在しません。それはすべてのオブジェクト(組み込み関数、 '__slots__'を持つもの、古いスタイルのクラスインスタンスなど)では存在しませんが。 – delnan

3

デバッグ用のメンバーを印刷するなどの作業には、これを使用すると問題はありません。しかし、それがあなたがやっていることなら、かわいいプリントをチェックしてください。

http://docs.python.org/library/pprint.html

__dict__の主な問題は、それが持っているのPythonオブジェクトの暗黙の可視性規則に違反しています。

+0

'__dict__'はハッカーです。それは強力で危険です。あなたはプログラミングのためにそれを必要としません。それが理由です。それが可視性に違反していることは、その一部分に過ぎません。 – delnan

+0

pprintを指摘していただきありがとうございます。 iPythonスタイルのコレクション印刷をエミュレートする簡単な方法があるかどうかは、私はいつも考えました。 – sans

+0

この '__dict__'問題は少しウサギの穴のようですが、私はそれをよく理解したいと思います。暗黙の可視性の規則によって、あなたはどういう意味ですか? – sans

5

__dict__属性のモジュールを脚注に記載しています。オブジェクトの__dict__属性には、そのような警告はありません(documentation)。

+0

アクセサ、メタクラス、またはスロットが使用されている場合、オブジェクトには同様の警告があります。例外は、Pythonでは非常に安価であるため、ジェネレータでの反復処理を終了するために使用されます。 – Apalala

関連する問題