my_package.my_module.MyClass
Was ist bei einer Zeichenfolge einer Python-Klasse der beste Weg, um sie zu laden?
Mit anderen Worten, ich suche ein Äquivalent Class.forName()
in Java, eine Funktion in Python. Es muss mit Google App Engine funktionieren.
Vorzugsweise ist dies eine Funktion, die den FQN der Klasse als Zeichenfolge akzeptiert und einen Verweis auf die Klasse zurückgibt:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
python
reflection
python-import
pjesi
quelle
quelle
Antworten:
In der Python-Dokumentation finden Sie folgende Funktion:
Der Grund, warum ein einfaches
__import__
nicht funktioniert, ist, dass jeder Import von etwas nach dem ersten Punkt in einer Paketzeichenfolge ein Attribut des Moduls ist, das Sie importieren. So etwas funktioniert nicht:Sie müssten die obige Funktion folgendermaßen aufrufen:
Oder im Fall Ihres Beispiels:
EDIT : Ich war ein bisschen daneben. Was Sie im Grunde tun möchten, ist Folgendes:
Die obige Funktion ist nur erforderlich, wenn Sie eine leere fromlist haben. Der entsprechende Aufruf wäre also wie folgt:
quelle
Wenn Sie nicht selbst rollen möchten, steht im
pydoc
Modul eine Funktion zur Verfügung , die genau dies ausführt:Der Vorteil dieses Ansatzes gegenüber den anderen hier aufgeführten ist , dass
locate
finden alle an dem vorgesehenen gepunkteten Pfad Python - Objekt, nicht nur ein Objekt direkt innerhalb eines Moduls. zBmy_package.my_module.MyClass.attr
.Wenn Sie neugierig sind, was ihr Rezept ist, ist hier die Funktion:
Es hängt von der
pydoc.safeimport
Funktion ab. Hier sind die Dokumente dafür:quelle
qualname
(Objekt nicht oben im Modul-Namespace) korrekt zu handhaben .locate('my_package.my_module.MyClass.attr.method.etc')
quelle
quelle
(modulename, classname) = cl.rsplit('.', 2)
rsplit('.', 1)
?Wenn Sie Django verwenden, können Sie dies verwenden. Ja, ich bin mir bewusst, dass OP nicht nach Django gefragt hat, aber ich bin auf diese Frage gestoßen, um nach einer Django-Lösung zu suchen, habe keine gefunden und sie hier für den nächsten Jungen / das nächste Mädchen, das danach sucht, abgelegt.
Denken Sie daran, wenn Sie etwas importieren möchten, das keine hat
.
, wiere
oderargparse
verwendet:quelle
Hier ist etwas zu teilen, was ich gefunden habe
__import__
undimportlib
während ich versucht habe, dieses Problem zu lösen.Ich benutze Python 3.7.3.
Wenn ich versuche, zur Klasse
d
im Modul zu gelangena.b.c
,Die
mod
Variablen beziehen sich auf den oberen Namespacea
.Um in die Klasse zu kommen
d
, muss ichWenn wir es versuchen
wir versuchen tatsächlich zu suchen
a.d
.Bei der Verwendung
importlib
hat die Bibliothek vermutlich die Rekursiongetattr
für uns durchgeführt. Wenn wir also verwendenimportlib.import_module
, bekommen wir tatsächlich das tiefste Modul in den Griff.quelle
OK, für mich hat das so funktioniert (ich benutze Python 2.7):
Dann ist b eine Instanz der Klasse 'MyClass'
quelle
Wenn Sie bereits eine Instanz Ihrer gewünschten Klasse haben, können Sie mit der Funktion 'type' den Klassentyp extrahieren und damit eine neue Instanz erstellen:
quelle
quelle
In Google App Engine gibt es eine
webapp2
Funktion namensimport_string
. Weitere Informationen finden Sie hier: https://webapp-improved.appspot.com/api/webapp2.htmlSo,
Dies wird beispielsweise verwendet,
webapp2.Route
wenn Sie entweder einen Handler oder eine Zeichenfolge verwenden können.quelle