Reflexion in Python

Eine Zusammenfassung der Reflektionsmethoden, z. B. das dynamische Erstellen einer Instanz in Python, das Erfassen und Aufrufen einer Methode.

Dynamische Instanziierung

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

Methodendefinition abrufen

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).

Eigenschaften abrufen

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

Reflexion in Python
Reflexion in Python
Quadtree in Python --2
Python in der Optimierung
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
FizzBuzz in Python
SQLite in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 18 in Python
Singleton-Muster in Python
Dateioperationen in Python
Tastenanschlag in Python
Täglicher AtCoder # 33 in Python
Logistische Verteilung in Python
Täglicher AtCoder # 7 in Python
LU-Zerlegung in Python
Ein Liner in Python
AtCoder # 24 jeden Tag mit Python
Fallklasse in Python
RNN-Implementierung in Python
AtCoder # 8 jeden Tag mit Python
Dateiverarbeitung in Python
Elasticsearch Reindex in Python
Täglicher AtCoder # 42 in Python
Grundlegende Sortierung in Python
HTTP-Anfrage in Python