Das Python -Skript wird ausgeführt. Ich habe einen Methodennamen als Zeichenfolge. Wie nenne ich diese Methode?
-
23-09-2019 - |
Frage
alle. Bitte beachten Sie Beispiele unten. Ich möchte eine Zeichenfolge an 'plan_action' -Methode angeben, die angibt, welche Bot-Klasse-Methode aufgerufen werden sollte. Im folgenden Beispiel habe ich es als "bot.action ()" dargestellt, aber ich habe keine Ahnung, wie ich es richtig machen soll. Bitte helfen Sie
class Bot:
def work(self): pass
def fight(self): pass
class Scheduler:
def schedule_action(self,action):
bot = Bot()
bot.action()
scheduler = Scheduler()
scheduler.schedule_action('fight')
Lösung
Verwenden Getattr:
class Bot:
def fight(self):
print "fighting is fun!"
class Scheduler:
def schedule_action(self,action):
bot = Bot()
getattr(bot,action)()
scheduler = Scheduler()
scheduler.schedule_action('fight')
Beachten Sie, dass GetAttr auch ein optionales Argument nimmt, mit dem Sie einen Standardwert zurückgeben können, falls die angeforderte Aktion nicht vorhanden ist.
Andere Tipps
Zusamenfassend,
getattr(bot, action)()
GetAttr wird ein Attribut des Objekts nach Namen nachschlagen - Attribute können Daten oder Mitgliedermethoden sein, die zusätzliche ()
Ruft am Ende die Methode auf.
Sie können die Methode auch in einem separaten Schritt wie diesem erhalten:
method_to_call = getattr(bot, action)
method_to_call()
Und Sie können Argumente auf die Methode auf die übliche Weise weitergeben:
getattr(bot, action)(argument1, argument2)
oder
method_to_call = getattr(bot, action)
method_to_call(argument1, argument2)
Ich bin mir nicht sicher, ob es in Ihrer Situation gilt, aber Sie können einen Funktionszeiger verwenden, anstatt die Saiten zu manipulieren.
class Bot:
def work(self):
print 'working'
def fight(self):
print 'fightin'
class Scheduler:
def schedule_action(self,action):
bot = Bot()
action(bot)
scheduler = Scheduler()
scheduler.schedule_action(Bot.fight)
scheduler.schedule_action(Bot.work)
Welche druckt:
fightin
working
Wenn Sie dies tun können, erhalten Sie einen Fehler in Bezug auf eine falsch geschriebene Funktion Bei Kompilierungszeit Wenn der Code während der Laufzeit interpretiert wird. Dies könnte Ihren Debug-Zyklus für dumme Dateneintrittsfehler verkürzen, insbesondere wenn die Aktionen über einen Zeitraum von Zeiten ausgeführt werden. Nichts ist mehr scheiße als über Nacht und entdeckt, dass Sie morgens einen Syntaxfehler hatten.
class Scheduler:
def schedule_action(self,action):
bot = Bot()
boundmethod = getattr(bot, action)
boundmethod()
def schedule_action(self,action):
bot = Bot()
bot.__getattribute__(action)()
Sie können auch ein Wörterbuch verwenden, um Methoden zu Aktionen zuzuordnen. Zum Beispiel:
ACTIONS = {"fight": Bot.fight,
"walk": Bot.walk,}
class Scheduler:
def schedule_action(self, action):
return ACTIONS[action](Bot())