Generieren Sie eine Klasse aus einer Zeichenfolge in Python

Wenn ein Skript etwas tun soll, verlasse ich normalerweise die Konfigurationsdatei, aggregiere die Einstellungen dort und wenn ich es ausführe, lade ich diese Konfiguration und führe sie aus. Unter den Einstellungswerten gab es Zeiten, in denen ich einen bestimmten Prozess in einer bestimmten Klasse ausführen wollte. Was soll ich in einem solchen Fall tun? Möchten Sie Parameter wie numerische Werte schreiben und Klassen generieren, indem Sie diese durch if-Minuten im Code teilen, z. B. ClassA für 1 und ClassB für 2? Wenn Sie ein neues Muster der Klasse C benötigen, müssen Sie den if-Teil des Codes hinzufügen. Mit Python können Sie mit globals () ein Klassenobjekt aus einer Zeichenfolge erstellen, was in solchen Fällen praktisch ist.

(aktualisieren) Wie im Kommentar erwähnt, kann die eval-Funktion auch ein Klassenobjekt aus einer Zeichenfolge erstellen.

globals() Dies kann mit der Funktion globals () erreicht werden. globals () gibt ein Wörterbuch der aktuell geladenen Module zurück. Sie können dies verwenden, um eine Klasse aus einer Zeichenfolge zu generieren.

Beispielcode

Dies ist ein Beispielcode.

parent_child.py


#Übergeordnete Klasse
class Parent(object):
  def __init__(self):
    pass

  def call(self):
    print("I am parent.")

#Kinderklasse 1
class ChildAsBrother(Parent):
  def __init__(self):
    super().__init__()

  def call(self):
    print("I am child as brother.")

#Kinderklasse 2
class ChildAsSister(Parent):
  def __init__(self):
    super().__init__()

  def call(self):
    print("I am child as sister.")

#Normale Objekterstellung und Aufruf
obj = Parent()
obj.call()

obj = ChildAsBrother()
obj.call()

# globals()Objekterzeugung mit
obj = globals()["ChildAsSister"]()     # <---Objekte können aus Zeichenfolgen erstellt werden
obj.call()

#hinzufügen
#Methode mit eval
obj = eval("ChildAsSister")()
obj.call()

obj = eval("ChildAsSister()")
obj.call()

Das Ausführungsergebnis wird so sein.

I am parent.
I am child as brother.
I am child as sister.
I am child as sister.
I am child as sister.

Auf diese Weise können Sie den Klassennamen angeben, den Sie in der Konfigurationsdatei verwenden möchten, und ihn direkt in Ihrem Code verwenden. Es ist bequem

Erstens, globals () ...

Was genau kehrt globals () überhaupt zurück? Ich habe es für einen Moment überprüft. Ich werde es hier als Referenz vorstellen.

print(globals())

#Eigentlich wird es in einer Zeile angezeigt, aber es ist schwer zu sehen, so dass es kaputt ist.
{'__name__': '__main__', 
'__doc__': None, 
'__package__': None, 
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0xffdc5c90>, 
'__spec__': None, 
'__annotations__': {}, 
'__builtins__': <module 'builtins' (built-in)>, 
'__file__': 'parent_child.py', 
'__cached__': None, 
'Parent': <class '__main__.Parent'>, 
'ChildAsBrother': <class '__main__.ChildAsBrother'>, 
'ChildAsSister': <class '__main__.ChildAsSister'>, 
'obj': <__main__.ChildAsSister object at 0xffd18b90>}

Ich kenne die Details nicht, aber es scheint, dass Metadaten und Klassen und Objekte in der Ausführungsumgebung verwaltet werden. Es scheint, dass die Klasse darin läuft.

Recommended Posts

Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Generieren Sie eine erstklassige Sammlung in Python
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
Erstellen Sie ein Datum / Uhrzeit-Objekt aus einer Zeichenfolge in Python (Python 3.3).
Django: Klasse aus String importieren
Erstellen Sie eine zufällige Zeichenfolge in Python
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
Fallklasse in Python
String-Manipulation in Python
Klassennotation in Python
Einbetten von Variablen in Python-Strings
Ich habe eine Klasse in Python3 und Java geschrieben
So generieren Sie ein Python-Objekt aus JSON
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Geben Sie eine kurze URL-ähnliche Zeichenfolge in Python aus
Fügen Sie ein Objekt in eine Zeichenfolge in Python ein
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Machen Sie einen Screenshot in Python
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Ich möchte eine Variable in einen Python-String einbetten
Generieren Sie in Python ein abgerundetes Miniaturbild
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Konvertieren Sie die Datumszeitzone (Zeitdifferenz) mit Python (aus Zeichenfolge).
Empfangen Sie Wörterbuchdaten von Python-Programmen mit AppleScript
[Python] Verwenden Sie eine Zeichenfolgenfolge
OCR aus PDF in Python
[Python] So erweitern Sie Variablen in einer Zeichenfolge
Generieren Sie eine U-Verteilung in Python
Erstellen Sie ein Lesezeichen in Python
Generieren Sie QR-Code in Python
Datumsmanipulation von Strings in Python
Zeichne ein Herz in Python
Generieren Sie 8 * 8 (64) Cubes mit Blender Python
Generieren Sie Word Cloud aus Testfalldaten mit Python3
So schneiden Sie ein Block-Multiple-Array aus einem Multiple-Array in Python
Verwendung der Methode __call__ in der Python-Klasse
[MQTT / Python] Implementierte eine Klasse, die Pub / Sub von MQTT in Python ausführt
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Python> Aus einer mehrzeiligen Zeichenfolge anstelle einer Datei lesen> io.StringIO ()
Wahrscheinlich in einer Nishiki-Schlange (Originaltitel: Vielleicht in Python)
Schreiben Sie eine Dichotomie in Python
[Python] Verwalten Sie Funktionen in einer Liste
Berühren Sie Python-Objekte in Elixir
Drücken Sie einen Befehl in Python (Windows)
[Python] Generiert QR-Code im Speicher
Erstellen Sie einen DI-Container mit Python
Erstellen Sie einen Pandas-Datenrahmen aus einer Zeichenfolge.
Zeichnen Sie eine Streudiagrammmatrix mit Python
ABC166 in Python A ~ C Problem
Generieren Sie das Jupyter-Notizbuch ".ipynb" in Python
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Lesen Sie PNG-Chunks in Python (Klassenausgabe)
Erstellen Sie eine Binärdatei in Python
Python / Machen Sie ein Diktat aus einer Liste.
Ein Memo zum Generieren dynamischer Klassenvariablen aus Wörterbuchdaten (dict), die in Python3 nur Standardtypdaten enthalten