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