2018年7月30日月曜日

オブジェクトが持つ attribute やメソッドの一覧を表示する方法

概要

Ruby だと puts や pp などでオブジェクト内の attributes の参照ができます
もしくは instance_variables をコールしても attributes の参照ができます
メソッドの参照をするには methods などを使えばできます
Python3 でも方法があるようなのでやってみました

環境

  • macOS X 10.13.6
  • Python 3.6.5

attributes を参照する方法

__dict__ を使う

対象のオブジェクトの __dict__ を参照します
これで attributes が key - value 形式で取得できます

  • vim attributes.py
class Hoge(object):
    def __init__(self):
        self.a = 'a'
        self.b = 'b'

    def func1(self):
        return self.a

h = Hoge()
print(h.__dict__)
  • python3 attributes.py

ただし以下のように別のクラスのオブジェクトを持っている場合は展開しません

class Fuga(object):
    def __init__(self):
        self.c = 'c'
        self.d = 'd'

    def func1(self):
        return self.c


class Hoge(object):
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        self.f = Fuga()

    def func1(self):
        return self.a

h = Hoge()
print(h.__dict__)
  • python3 attributes.py
{'a': 'a', 'b': 'b', 'f': <__main__.Fuga object at 0x10e34aa20>}

vars() を使う

中身は __dict__ と同じらしいです
最後の部分を以下のように書き換えれば OK です

  • vim attributes2.py
print(vars(h))

ただしこの場合もネスト的に展開はしてくれません

メソッドを参照する方法

いきなり複雑になりますが以下の通りです
dir()getattr() を使います

  • methods.py
class Fuga(object):
    def __init__(self):
        self.c = 'c'
        self.d = 'd'

    def func1(self):
        return self.c


class Hoge(object):
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        self.f = Fuga()

    def func1(self):
        return self.a

h = Hoge()
methods = [method for method in dir(h) if callable(getattr(h, method))]
print(methods)

最後に

Python3 でオブジェクトが持つ attributes とメソッドを参照する方法を紹介しました
正直 Ruby のように簡単にはいきませんができるのはできました

参考サイト

0 件のコメント:

コメントを投稿