Refleksi dengan python jauh lebih mudah dan jauh lebih fleksibel daripada di Java.
Saya merekomendasikan membaca tutorial ini
Tidak ada fungsi langsung (yang saya ketahui) yang mengambil nama kelas yang memenuhi syarat dan mengembalikan kelas, namun Anda memiliki semua bagian yang diperlukan untuk membangunnya, dan Anda dapat menghubungkannya bersama.
Sedikit saran: jangan mencoba memprogram dengan gaya Java saat Anda menggunakan python.
Jika Anda dapat menjelaskan apa yang Anda coba lakukan, mungkin kami dapat membantu Anda menemukan cara yang lebih pythonic untuk melakukannya.
Inilah fungsi yang melakukan apa yang Anda inginkan:
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
Anda dapat menggunakan nilai hasil dari fungsi ini seolah-olah itu adalah kelas itu sendiri.
Berikut contoh penggunaan:
>>> 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)
>>>
Bagaimana cara kerjanya?
Kami menggunakan __import__
untuk mengimpor modul yang menampung kelas, yang mengharuskan kami mengekstrak nama modul dari nama yang sepenuhnya memenuhi syarat. Kemudian kami mengimpor modul:
m = __import__( module )
Pada kasus ini, m
hanya akan mengacu pada modul tingkat atas,
Misalnya, jika kelas Anda tinggal di foo.baz
modul, maka m
akan menjadi modul. foo
Kita dapat dengan mudah mendapatkan referensi untuk foo.baz
digunakangetattr( m, 'baz' )
Untuk mendapatkan dari modul tingkat atas ke kelas, harus menggunakan secara rekursif gettatr
nama kelas
Katakanlah misalnya, jika nama kelas Anda foo.baz.bar.Model
maka kami melakukan ini:
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
Inilah yang terjadi di loop ini:
for comp in parts[1:]:
m = getattr(m, comp)
Di akhir loop, m
akan menjadi referensi ke kelas. Ini berarti itu m
sebenarnya adalah kelasnya sendiri, Anda dapat melakukannya misalnya:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
, yang di-backport dari python 3 ke 2.7 ( docs.python.org/2/library/importlib.html )