私はC#でリフレクションを使用します。 Javascriptでは、次のように簡単です。
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Pythonでそれを行う方法?
for property, value in vars(theObject).iteritems():
print property, ": ", value
まれに__slots__
プロパティがある場合がありますが、そのようなクラスには__dict__
がないことが多いことに注意してください。
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']
>>>
dir()
は簡単な方法です。こちらをご覧ください:
オブジェクトの__dict__
プロパティは、定義されている他のすべてのプロパティの辞書です。 Pythonクラスは getattr をオーバーライドし、プロパティのように見えるがin__dict__
ではないものを作成できることに注意してください。微妙に異なる組み込み関数vars()
とdir()
もあります。また、__slots__
は、いくつかの異常なクラスの__dict__
を置き換えることができます。
Pythonではオブジェクトは複雑です。 __dict__
は、リフレクションスタイルのプログラミングを開始するのに適した場所です。 dir()
は、インタラクティブなシェルでハックしている場合に開始する場所です。
すべてのプロパティのリフレクションを探している場合、上記の答えは素晴らしいです。
オブジェクトのキーを取得するだけの場合は、使用します
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
ジョージショリーショートバージョン
print vars(theObject)