web-dev-qa-db-ja.com

Pythonですべてのオブジェクト属性を取得しますか?

all attributes/methods/fields/etcを取得する方法はありますか。 Pythonのオブジェクトの?

vars()近いですが、オブジェクトが__dict__を持っていないとうまくいきません。これは必ずしも真実ではありません(例えばlistname__、dictname__では真実ではありません)。など)。

297
Mehrdad

組み込み関数 dir() を使用してください。

381
mouad

おそらく欲しいのは dir() です。

キャッチはクラスが特別な__dir__メソッドをオーバーライドすることができるということです、それはdir()がクラスが望むものは何でも返すようにします(彼らは正確なリストを返すことが奨励されますが、これは強制されません)。さらに、オブジェクトによっては、__getattr__をオーバーライドすることによって動的属性を実装することも、RPCプロキシオブジェクトにすることも、C拡張クラスのインスタンスにすることもできます。あなたのオブジェクトがこれらの例の1つである場合、それらは__dict__ または を持っていないかもしれません__dir__を通して属性の包括的なリストを提供することができません。実際に知っている what あなたがアクセスしようとするまでそれは持っています。

手短に言えば、dir()が十分でない場合、オブジェクトに対して__dict__をトラバースし、次に__dict__内のすべてのクラスに対してobj.__class__.__mro__をトラバースする関数を書くことができます。ただしこれは通常のPythonオブジェクトに対してのみ機能します。長い目で見れば、アヒルタイピング+仮定を使わなければならないかもしれません - それがアヒルのように見えるならば、あなたの指を交差させてください、そしてそれが.feathersを持っていることを望みます。

67
Eli Collins

私は__dict__を使います

class MyObj(object):
  def __init__(self):
    self.name = 'Chuck Norris'
    self.phone = '+6661'

obj = MyObj()
print(obj.__dict__)

# Output:  
# {'phone': '+6661', 'name': 'Chuck Norris'}
56
Slipstream

属性を取得するにはdir(your_object)を、値を取得するにはgetattr(your_object, your_object_attr)を使用できます。

使用法 :

for att in dir(your_object):
    print (att, getattr(your_object,att))
7
Jason Angel