Aus einer Reihe von Zeichenfolge, ich versuche Methoden innerhalb einer Klasse aufzurufen. Leider wird die Methode nicht ordnungsgemäß aufgerufen, da sie das self
benötigt, um anzugeben, dass es in der Klasse intern ist. Wie kann ich diese Logik reparieren?Aufruf Methoden innerhalb einer Klasse aus einer Reihe von Zeichenfolge
class SomeClass(object):
def apply(self):
rules = [{'action': 'replace'}, {'action': 'split'}, {'action': 'remove'}]
return [eval('_perform_' + r['action'])() for r in rules
if r['action'] in ['replace', 'split', 'remove']]
def _perform_replace(self):
print("performing replace")
def _perform_split(self):
print("performing split")
def _perform_remove(self):
print("performing remove")
SomeClass().apply()
Dies wirft Ausnahme folgende:
NameError: name '_perform_replace' is not defined
Wenn Sie auf 'staticmethods' zugreifen möchten, müssen Sie einen' decorater' verwenden, um die Klasse als statische Elementfunktion zu definieren. Dann nennst du es wie 'SomeClass.apply()' ohne die '()'. Wenn Sie versuchen, Strings in Python zu trennen/zu entkommen, gibt es viel einfachere Möglichkeiten als das, was Sie tun möchten. – user1767754
Könnten Sie das näher erläutern? Ich weiß, dass es einfache Methoden gibt, aber hier ist meine "Regeln" -Liste eigentlich eine JSON-Datei mit mehreren domänenspezifischen Regeln. - Die Ersetzung/Aufteilung/Entfernung sind komplizierter und erfordern Interaktionen mit Pandas Datenrahmen. Ich habe das nicht erklärt, um mich auf den Kern meines Problems zu konzentrieren. – Michael
Sie können mit getattr auf die Methoden wie Attribute des Objekts zugreifen. Also von innerhalb Ihrer Anwendung Methode könnten Sie 'getattr verwenden (selbst, '_perform_' + r ['Aktion'])()' – antonagestam