web-dev-qa-db-ja.com

クラスのすべてのフィールドをリストする方法(メソッドなし)

oがPythonオブジェクトであり、メソッドまたは___stuff___なしのoのすべてのフィールドが必要だと仮定します。終わった?

私は次のようなことを試しました:

_[f for f in dir(o) if not callable(f)]

[f for f in dir(o) if not inspect.ismethod(f)]
_

しかし、これらはdir(o)と同じものを返します。おそらくdirが文字列のリストを提供するためです。また、___class___のようなものがここに返されます。これが機能するようになってもです。

42
Eric Wilson

__dict__属性、または ビルトインvars 関数を使用して取得できます。これは単なるショートカットです。

>>> class A(object):
...     foobar = 42
...     def __init__(self):
...         self.foo = 'baz'
...         self.bar = 3
...     def method(self, arg):
...         return True
...
>>> a = A()
>>> a.__dict__
{'foo': 'baz', 'bar': 3}
>>> vars(a)
{'foo': 'baz', 'bar': 3}

オブジェクトの属性のみがあります。メソッドとクラス属性は存在しません。

54
Maxime Lorant

基本的な答えは、「確実にそうすることはできない」です。 この質問 を参照してください。

[attr for attr in dir(obj) if attr[:2] + attr[-2:] != '____' and not callable(getattr(obj,attr))]で近似値を取得できます。

ただし、これに頼るべきではありません because

dir()は主に対話型プロンプトで使用するための利便性として提供されるため、厳密にまたは一貫して定義された名前のセットを提供しようとするよりも興味深い名前のセットを提供しようとします。リリース間で変更します。

つまり、「オブジェクトのすべての属性」(または「オブジェクトのすべてのメソッド」)のリストを取得する標準的な方法はありません。

オブジェクトの未知のフィールドを反復処理する必要がある何らかの動的プログラミングを行っている場合、それを行う唯一の信頼できる方法は、それらのフィールドを追跡する独自の方法を実装することです。たとえば、属性の命名規則、特別な「フィールド」オブジェクト、または最も単純な辞書を使用できます。

8
BrenBarn

組み込みメソッドvars()を使用できます

6
bvidal

インスタンスの__dict__attributeおよびメソッド以外のものを探します。
例えば:

CALLABLES = (types.FunctionType, types.MethodType)
for key, value in A().__dict__.items():
    if not isinstance(value, CALLABLES):
        print key

出力:

foo
bar

リスト内包表記を使用して、単一のステートメントでそれを行うことができます。

print [key for key, value in A.__dict__.items()
            if not isinstance(value, CALLABLES)]

['foo', 'bar']

5
martineau

これは呼び出し可能オブジェクトで機能するはずです:

[f for f in dir(o) if not callable(getattr(o,f))]

あなたは残りを取り除くことができます:

[f for f in dir(o) if not callable(getattr(o,f)) and not f.startswith('__')]
4
Benjamin Toueg