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__
_のようなものがここに返されます。これが機能するようになってもです。
__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}
オブジェクトの属性のみがあります。メソッドとクラス属性は存在しません。
基本的な答えは、「確実にそうすることはできない」です。 この質問 を参照してください。
[attr for attr in dir(obj) if attr[:2] + attr[-2:] != '____' and not callable(getattr(obj,attr))]
で近似値を取得できます。
ただし、これに頼るべきではありません because :
dir()
は主に対話型プロンプトで使用するための利便性として提供されるため、厳密にまたは一貫して定義された名前のセットを提供しようとするよりも興味深い名前のセットを提供しようとします。リリース間で変更します。
つまり、「オブジェクトのすべての属性」(または「オブジェクトのすべてのメソッド」)のリストを取得する標準的な方法はありません。
オブジェクトの未知のフィールドを反復処理する必要がある何らかの動的プログラミングを行っている場合、それを行う唯一の信頼できる方法は、それらのフィールドを追跡する独自の方法を実装することです。たとえば、属性の命名規則、特別な「フィールド」オブジェクト、または最も単純な辞書を使用できます。
組み込みメソッドvars()
を使用できます
インスタンスの__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']
。
これは呼び出し可能オブジェクトで機能するはずです:
[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('__')]