web-dev-qa-db-ja.com

Pythonでオブジェクトのプロパティを列挙する方法は?

私はC#でリフレクションを使用します。 Javascriptでは、次のように簡単です。

for(var propertyName in objectName)
    var currentPropertyValue = objectName[propertyName];

Pythonでそれを行う方法?

110
Jader Dias
for property, value in vars(theObject).iteritems():
    print property, ": ", value

まれに__slots__プロパティがある場合がありますが、そのようなクラスには__dict__がないことが多いことに注意してください。

130
Georg Schölly

inspect.getmembers(object[, predicate]) を参照してください。

名前でソートされた(名前、値)のペアのリストでオブジェクトのすべてのメンバーを返します。オプションの述語引数が指定されている場合、述語が真の値を返すメンバーのみが含まれます。

>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', 
'__delslice__',    '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', 
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__', 
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', 
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 
'insert', 'pop', 'remove', 'reverse', 'sort']
>>> 
65
gimel

dir() は簡単な方法です。こちらをご覧ください:

ガイドPythonイントロスペクション

52
EBGreen

オブジェクトの__dict__プロパティは、定義されている他のすべてのプロパティの辞書です。 Pythonクラスは getattr をオーバーライドし、プロパティのように見えるがin__dict__ではないものを作成できることに注意してください。微妙に異なる組み込み関数vars()dir()もあります。また、__slots__は、いくつかの異常なクラスの__dict__を置き換えることができます。

Pythonではオブジェクトは複雑です。 __dict__は、リフレクションスタイルのプログラミングを開始するのに適した場所です。 dir()は、インタラクティブなシェルでハックしている場合に開始する場所です。

12
Nelson

すべてのプロパティのリフレクションを探している場合、上記の答えは素晴らしいです。

オブジェクトのキーを取得するだけの場合は、使用します

my_dict.keys()

my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys() 
> ['abc', 'def', 'ghi']
11
MrE

ジョージショリーショートバージョン

print vars(theObject)
11
Nicolas Rojo