Diberikan string dari kelas Python, misalnya my_package.my_module.MyClass
, apa cara terbaik untuk memuatnya?
Dengan kata lain saya mencari yang setara Class.forName()
di Jawa, berfungsi dengan Python. Perlu bekerja di Google App Engine.
Lebih disukai ini adalah fungsi yang menerima FQN dari kelas sebagai string, dan mengembalikan referensi ke kelas:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
python
reflection
python-import
pjesi
sumber
sumber
Jawaban:
Dari dokumentasi python, inilah fungsi yang Anda inginkan:
Alasan sederhana
__import__
tidak akan bekerja adalah karena setiap impor apa pun melewati titik pertama dalam paket string adalah atribut dari modul yang Anda impor. Dengan demikian, sesuatu seperti ini tidak akan berfungsi:Anda harus memanggil fungsi di atas seperti:
Atau dalam hal contoh Anda:
EDIT : Saya agak kecewa dengan hal ini. Apa yang pada dasarnya ingin Anda lakukan adalah ini:
Fungsi di atas hanya diperlukan jika Anda memiliki daftar kosong . Dengan demikian, panggilan yang tepat akan seperti ini:
sumber
Jika Anda tidak ingin roll sendiri, ada fungsi yang tersedia di
pydoc
modul yang melakukan ini:Keuntungan dari pendekatan ini atas yang lain yang tercantum di sini adalah bahwa
locate
akan menemukan setiap objek python di jalan putus-putus yang disediakan, bukan hanya obyek langsung dalam sebuah modul. mismy_package.my_module.MyClass.attr
.Jika Anda ingin tahu apa resep mereka, inilah fungsinya:
Itu bergantung pada
pydoc.safeimport
fungsi. Inilah dokumen untuk itu:sumber
qualname
(objek tidak di atas modul namespace) dengan benar juga.locate('my_package.my_module.MyClass.attr.method.etc')
sumber
sumber
(modulename, classname) = cl.rsplit('.', 2)
rsplit('.', 1)
?Jika Anda menggunakan Django, Anda dapat menggunakan ini. Ya saya sadar OP tidak meminta Django, tetapi saya menemukan pertanyaan ini untuk mencari solusi Django, tidak menemukan satu, dan menaruhnya di sini untuk anak laki-laki / perempuan berikutnya yang mencarinya.
Ingat, jika Anda ingin mengimpor sesuatu yang tidak memiliki
.
, sukare
atauargparse
gunakan:sumber
Ini untuk membagikan sesuatu yang saya temukan di
__import__
danimportlib
saat mencoba menyelesaikan masalah ini.Saya menggunakan Python 3.7.3.
Ketika saya mencoba untuk masuk ke kelas
d
dalam modula.b.c
,The
mod
variabel merujuk ke puncak namespacea
.Jadi untuk sampai ke kelas
d
, saya harusJika kita coba lakukan
kami sebenarnya sedang mencari
a.d
.Saat menggunakan
importlib
, saya kira perpustakaan telah melakukan rekursifgetattr
untuk kita. Jadi, ketika kita gunakanimportlib.import_module
, kita benar-benar mendapatkan pegangan pada modul terdalam.sumber
OK, bagi saya itu cara kerjanya (saya menggunakan Python 2.7):
Kemudian, b adalah turunan dari kelas 'MyClass'
sumber
Jika Anda telah memiliki instance dari kelas yang Anda inginkan, Anda dapat menggunakan fungsi 'type' untuk mengekstrak tipe kelasnya dan menggunakan ini untuk membuat instance baru:
sumber
sumber
Di Google App Engine ada
webapp2
fungsi yang disebutimport_string
. Untuk info lebih lanjut lihat di sini: https://webapp-improved.appspot.com/api/webapp2.htmlBegitu,
Misalnya ini digunakan di
webapp2.Route
mana Anda bisa menggunakan pawang atau string.sumber