Dalam python, saya harus instantiate kelas tertentu, mengetahui namanya dalam sebuah string, tetapi kelas ini 'hidup' dalam modul yang diimpor secara dinamis. Contoh berikut:
skrip kelas loader:
import sys
class loader:
def __init__(self, module_name, class_name): # both args are strings
try:
__import__(module_name)
modul = sys.modules[module_name]
instance = modul.class_name() # obviously this doesn't works, here is my main problem!
except ImportError:
# manage import error
beberapa skrip modul yang dinamis:
class myName:
# etc...
Saya menggunakan pengaturan ini untuk membuat modul apa pun yang dimuat secara dinamis untuk digunakan oleh kelas pemuat mengikuti perilaku tertentu yang telah ditentukan sebelumnya dalam modul yang dimuat-din ...
module = __import__(module, fromlist=[name])
hanya bekerja untukku.obj.__module__
importlib.import_module
akan memuat file .py ke dalam pyc jika diperlukan dan juga menangani module.name.pathing.to.get.to.the yang lengkap.__import__
tidak akan melakukan salah satu dari hal-hal ini, dalam lingkungan Django (tidak diuji di luar ini)tl; dr
Impor modul root dengan
importlib.import_module
dan muat kelas dengan namanya menggunakangetattr
fungsi:penjelasan
Anda mungkin tidak ingin menggunakan
__import__
untuk secara dinamis mengimpor modul dengan nama, karena tidak memungkinkan Anda untuk mengimpor submodul:Inilah yang dikatakan python doc tentang
__import__
:Sebagai gantinya, gunakan
importlib
modul standar untuk mengimpor modul secara dinamis dengan nama. Dengangetattr
Anda kemudian dapat instantiate kelas dengan namanya:Anda juga bisa menulis:
Kode ini valid dalam python ≥ 2.7 (termasuk python 3).
sumber
mod = __import__("os.path"); mod.join
sementara yang berikut tidak:mod = importlib.import_module("os.path"); mod.join
Gunakan
getattr
untuk mendapatkan atribut dari nama dalam sebuah string. Dengan kata lain, dapatkan instance sebagaisumber
Salin-tempel cuplikan:
sumber
Jika Anda ingin kalimat ini
from foo.bar import foo2
dimuat secara dinamis, Anda harus melakukan inisumber
Seseorang dapat menggunakan
pydoc.locate
fungsi tersebut.sumber
Saya tidak bisa sampai di sana dalam kasus penggunaan saya dari contoh di atas, tetapi Ahmad mendapatkan saya yang paling dekat (terima kasih). Bagi mereka yang membaca ini di masa depan, berikut adalah kode yang berfungsi untuk saya.
sumber