Das Python -Skript wird ausgeführt. Ich habe einen Methodennamen als Zeichenfolge. Wie nenne ich diese Methode?

StackOverflow https://stackoverflow.com/questions/2344212

  •  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')
War es hilfreich?

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())
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top