inspect.getmembers(object[, typecheck])
まずは結論から
foo.py
class foo1:
'''something code'''
class foo2:
'''something code'''
class foo3:
'''something code'''
get_class
import foo
import inspect
classes = map(lambda x:x[0],inspect.getmembers(foo,inspect.isclass))
print classes
# => ['foo1','foo2','foo3']
inspect.getmembers(object)
はobject
に登録されているオブジェクトの全メンバーを取得します。
形式は[(member1,type),(member2,type),....]といった形。
inspect.is--
はそのオブジェクトが--
に一致するかを判定するもので、
class, module, function, method .....と16個あるらしい。
詳しくはこちら。
そのため、inspect.getmembers(foo,inspect.isclass)
でこんな形になっていたはず。
get_class
print inspect.getmembers(foo,inspect.isclass)
# => [('foo1',<class foo.foo1 at 0x*******>),('foo1',<class foo.foo2 at 0x*******>),('foo3',<class foo.foo3 at 0x*******>)]
あとは各要素の第0要素だけ抜き出してあげればいいので
map(lambda x:x[0], list)
でおしまい。
第1要素の方はクラスそのものだから、クラスオブジェクトそのものも取得できる。
例えばクラス名の一部をkeyに検索をかけて、一致するクラスオブジェクトを取得するとする。
getclass
import foo
import inspect
classes = inspect.getmembers(foo,inspect.isclass)
for i in classes:
if '2' in i[0]:
something2 = i[1]
something2class = something2()
print something2class.__class__.__name__
# => foo2
ただしこの場合、検索に引っかからないとたぶんエラーが出る。