IC#はリフレクションを介して行います。JavaScriptでは、次のように簡単です。
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Pythonでそれを行う方法?
@property
。
IC#はリフレクションを介して行います。JavaScriptでは、次のように簡単です。
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Pythonでそれを行う方法?
@property
。
回答:
for property, value in vars(theObject).iteritems():
print property, ": ", value
一部のまれなケースでは__slots__
プロパティがあることに注意してください__dict__
。そのようなクラスにはがないことがよくあります。
__setattr__()
ます。ディクショナリに直接値を設定すると、オブジェクトのセッター(またはその親)がバイパスされます。Pythonでは、属性の設定(衛生など)中に目に見えるものよりも多くのことがバックグラウンドで発生しているsetattr()
ことがよくあります。これを使用すると、見落とさないようにしたり、明示的に自分で処理したりする必要があります。
vars()
のみを返します。動的メンバー(つまり、オブジェクトのメソッドまたは同様のマジックによって動的に定義されたオブジェクト属性およびメソッド)は返しません。ほとんどの場合、目的のプロパティは動的に定義されるため、またはで使用できません。__dict__
__getattr__()
file.ImplementationName
vars()
dir()
を参照してください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']
>>>
attributes
代わりにこの用語を使用しているためですmembers
(2つの間に違いはありますか?)。彼らは、一貫性を持たせるために、Python 3.0で名前を修正することができました。
__dict__
、申し訳ありません。
dir()
簡単な方法です。こちらをご覧ください:
dir()
ありがとうを忘れています。
__dict__
オブジェクトのプロパティは、他のすべての定義済みプロパティの辞書です。Pythonクラスはgetattr
をオーバーライドし、プロパティのように見えるがにはないものを作成できることに注意してください__dict__
。また、組み込み機能がありますvars()
し、dir()
微妙な方法で異なっています。そして、いくつかの珍しいクラスで__slots__
置き換えることができ__dict__
ます。
Pythonではオブジェクトは複雑です。__dict__
リフレクションスタイルのプログラミングを始めるのに最適な場所です。dir()
対話型シェルでハッキングしている場合に開始する場所です。
print vars.__doc__
ことを示しているWith an argument, equivalent to object.__dict__
ので、微妙な違いは何でしょうか?
すべてのプロパティの反映を探しているなら、上記の答えは素晴らしいです。
辞書のキー(Pythonの「オブジェクト」とは異なります)を取得するだけの場合は、次を使用します。
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
対obj.property
)との質問は、オブジェクトのプロパティについてでした。2つの間で簡単に混乱するので、ここに私の回答を示します。
これは他の回答で完全にカバーされていますが、私はそれを明確にします。オブジェクトは、クラス属性と静的および動的インスタンス属性を持つことができます。
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
静的でdyno
あり、動的であり(プロパティデコレータを参照)classy
、クラス属性です。単に行う__dict__
かvars
、静的なもののみを取得する場合。
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
したがって、他のユーザー__dict__
がすべて(およびそれ以上)を取得できるようにしたい場合。これには、魔法のメソッドと属性、および通常のバインドメソッドが含まれます。だからそれらを避けましょう:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
type
プロパティ飾ら方法(動的属性)と呼ばれる、あなたの戻り値の種類ではなくなりますmethod
。これを証明するために、jsonで文字列化します。
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
それがクラッシュした方法だったとしたら。
TL; DR。extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
3つすべてを呼び出すようにしてください。ただし、メソッドや魔法は必要ありません。