In Python muss ich eine bestimmte Klasse instanziieren und ihren Namen in einer Zeichenfolge kennen, aber diese Klasse "lebt" in einem dynamisch importierten Modul. Ein Beispiel folgt:
Loader-Class-Skript:
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
Skript für ein dynamisch geladenes Modul:
class myName:
# etc...
Ich benutze diese Anordnung, um jedes dynamisch geladene Modul so zu gestalten, dass es von der Loader-Klasse nach bestimmten vordefinierten Verhaltensweisen in den dyn-geladenen Modulen verwendet wird ...
module = __import__(module, fromlist=[name])
hat nur für mich gearbeitet.obj.__module__
importlib.import_module
lädt die .py-Datei bei Bedarf in einen pyc und verarbeitet den vollständigen Modulnamen.Pfad.zu.get.zu.der Klasse.__import__
wird keines dieser Dinge tun, in einer Django-Umgebung (nicht außerhalb davon getestet)tl; dr
Importieren Sie das Root-Modul mit
importlib.import_module
und laden Sie die Klasse anhand ihres Namens mithilfe der folgendengetattr
Funktion:Erklärungen
Sie möchten wahrscheinlich kein
__import__
Modul dynamisch nach Namen importieren, da Sie damit keine Submodule importieren können:Hier ist , was der Python - doc sagt über
__import__
:Verwenden Sie stattdessen das Standardmodul
importlib
, um ein Modul dynamisch nach Namen zu importieren. Mit könnengetattr
Sie dann eine Klasse anhand ihres Namens instanziieren:Sie könnten auch schreiben:
Dieser Code ist in Python ≥ 2.7 (einschließlich Python 3) gültig.
quelle
mod = __import__("os.path"); mod.join
während der folgende nicht:mod = importlib.import_module("os.path"); mod.join
Verwenden Sie
getattr
diese Option , um ein Attribut aus einem Namen in einer Zeichenfolge abzurufen. Mit anderen Worten, erhalten Sie die Instanz alsquelle
Kopieren-Einfügen-Snippet:
quelle
Wenn Sie möchten, dass dieser Satz
from foo.bar import foo2
dynamisch geladen wird, sollten Sie dies tunquelle
Man kann einfach die
pydoc.locate
Funktion benutzen .quelle
Ich konnte in meinem Anwendungsfall aus den obigen Beispielen nicht ganz dahin gelangen, aber Ahmad hat mich am nächsten gebracht (danke). Für diejenigen, die dies in Zukunft lesen, ist hier der Code, der für mich funktioniert hat.
quelle