W Pythonie muszę utworzyć instancję określonej klasy, znając jej nazwę w ciągu, ale ta klasa „żyje” w dynamicznie importowanym module. Oto przykład:
skrypt klasy ładującej:
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
jakiś dynamicznie ładowany skrypt skryptu:
class myName:
# etc...
Korzystam z tego układu, aby każdy moduł ładowany dynamicznie był używany przez klasę modułu ładującego zgodnie z pewnymi predefiniowanymi zachowaniami w modułach ładowanych dynamicznie ...
module = __import__(module, fromlist=[name])
działało tylko dla mnie.obj.__module__
importlib.import_module
w razie potrzeby załaduje plik .py do pliku pyc, a także obsłuży kompletny moduł.nazwa.pathing.to.get.to. klasy.__import__
nie zrobi żadnej z tych rzeczy w środowisku django (nie testowane poza tym)tl; dr
Zaimportuj moduł główny
importlib.import_module
i załaduj klasę według jej nazwy, używającgetattr
funkcji:wyjaśnienia
Prawdopodobnie nie chcesz używać
__import__
do dynamicznego importowania modułu według nazwy, ponieważ nie pozwala on na importowanie submodułów:Oto, co mówi dokument Python
__import__
:Zamiast tego użyj standardowego
importlib
modułu, aby dynamicznie zaimportować moduł według nazwy. Za pomocągetattr
możesz utworzyć instancję klasy według jej nazwy:Możesz także napisać:
Ten kod jest poprawny w pythonie ≥ 2.7 (w tym python 3).
źródło
mod = __import__("os.path"); mod.join
podczas gdy następujący nie:mod = importlib.import_module("os.path"); mod.join
Użyj,
getattr
aby uzyskać atrybut z nazwy w ciągu. Innymi słowy, pobierz instancję jakoźródło
Skopiuj i wklej fragment kodu:
źródło
Jeśli chcesz, aby to zdanie
from foo.bar import foo2
było ładowane dynamicznie, powinieneś to zrobićźródło
Można po prostu użyć tej
pydoc.locate
funkcji.źródło
Nie mogłem się do końca dostać w moim przypadku użycia z powyższych przykładów, ale Ahmad dał mi najbliższą (dziękuję). Dla tych, którzy czytają to w przyszłości, oto kod, który działał dla mnie.
źródło