Python でのリフレクションは、Java でのリフレクションよりもはるかに簡単で、はるかに柔軟です。
このチュートリアルを読むことをお勧めします
完全修飾クラス名を取り、クラスを返す直接関数 (私が知っている) はありませんが、それを構築するために必要なすべての要素があり、それらを接続することができます。
ただし、ちょっとしたアドバイス: Python を使用している場合は、Java スタイルでプログラミングしようとしないでください。
あなたが何をしようとしているのかを説明できれば、より Pythonic な方法を見つけるお手伝いができるかもしれません。
これがあなたが望むことをする関数です:
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
この関数の戻り値を、クラスそのものであるかのように使用できます。
使用例を次に示します。
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
それはどのように機能しますか?
クラスを保持するモジュールをインポートするために使用しています。__import__
これには、最初に完全修飾名からモジュール名を抽出する必要がありました。次に、モジュールをインポートします。
m = __import__( module )
この場合、m
最上位モジュールのみを参照します。
たとえば、クラスがfoo.baz
モジュール内にある場合m
、モジュールは、使用foo
する参照を簡単に取得できますfoo.baz
getattr( m, 'baz' )
最上位モジュールからクラスに到達するにgettatr
は、クラス名の一部を再帰的に使用する必要があります
たとえば、クラス名が の場合、次のようfoo.baz.bar.Model
にします。
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
これがこのループで起こっていることです:
for comp in parts[1:]:
m = getattr(m, comp)
ループの最後にm
、クラスへの参照になります。これは、m
実際にはクラス自体であることを意味します。たとえば、次のことができます。
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor