Eine Zusammenfassung der Reflektionsmethoden, z. B. das dynamische Erstellen einer Instanz in Python, das Erfassen und Aufrufen einer Methode.
Wenn Sie in Python dynamisch eine Instanz aus einer Zeichenfolge erstellen möchten, gehen Sie wie folgt vor.
mod = __import__("exceptions",fromlist=["Exception"])
class_def = getattr(mod,"Exception")
obj = class_def("message") # obj = Exception('message',)
Das führende "import" entspricht der Importdeklaration (im obigen Beispiel hat es die gleiche Bedeutung wie das Ausführen von "Exception Import Exception". Es ist nicht erforderlich, Ausnahmen explizit zu lesen. Dies ist nur ein Beispiel. Ist).
Holen Sie sich die Klassendefinition der entsprechenden Klasse aus diesem Modul mit getattr
und erstellen Sie schließlich ein Objekt damit.
Referenz
How to dynamically load a Python class
Verwenden Sie inspect, um die Definition der Klasse einschließlich der Methode abzurufen.
Der Ablauf besteht darin, die Definition mit inspect.getmembers
abzurufen, die Definition mit getattr
aus dem Objekt abzurufen und auszuführen.
Natürlich können Sie getattr
direkt aufrufen, wenn der Methodenname im Voraus einen Treffer hat.
upper_method = filter(lambda f: f[0] == "upper", inspect.getmembers("String",inspect.isroutine))[0]
invoker = getattr("abc",upper_method[0])
invoker() # 'ABC'
Es ist eine natürliche Hoffnung, dass ich nur diejenigen mit Dekorateuren nehmen möchte, aber im Moment [sehr schlammige Methoden](http://stackoverflow.com/questions/5910703/howto-get-all-methods-of- Es scheint, dass es nur eine (Python-Klasse mit gegebenem Dekorator) gibt (insbesondere fühlt es sich an, als würde man den Quellcode lesen und nach dem Anfang @ suchen).
Wenn Sie alle öffentlichen Eigenschaften (Mitgliedsvariablen) abrufen möchten, gehen Sie wie folgt vor.
attributes = inspect.getmembers(self, lambda a: not(inspect.isroutine(a)))
filter(lambda a: not(a[0].startswith("__")), attributes)
Diejenigen, die nicht "isroutine" = Mitgliedsvariablen entsprechen, werden extrahiert, und diejenigen, deren Namen nicht mit "__" beginnen, werden extrahiert.
Um den Wert aus der erhaltenen Eigenschaft zu erhalten, verwenden Sie getattr
sowie die Methode.
Recommended Posts