script Python est en cours d'exécution. J'ai un nom de méthode comme une chaîne. Comment puis-je appeler cette méthode?

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

  •  23-09-2019
  •  | 
  •  

Question

tout le monde. S'il vous plaît voir l'exemple ci-dessous. Je voudrais fournir une chaîne méthode « schedule_action » qui précise, quelle méthode Bot-classe doit être appelée. Dans l'exemple ci-dessous, je l'ai représenté comme « bot.action () », mais je ne sais pas comment le faire correctement. S'il vous plaît aider

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')
Était-ce utile?

La solution

Utilisez 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')

Notez que getAttr prend également un argument optionnel qui vous permet de retourner une valeur par défaut dans le cas où l'action demandée n'existe pas.

Autres conseils

En bref,

getattr(bot, action)()

getattr rechercher un attribut sur l'objet par son nom -. Les attributs peuvent être données ou méthodes membres Le () supplémentaire à la fin appelle la méthode

Vous pouvez obtenir la méthode dans une étape séparée, comme celui-ci, ainsi:

method_to_call = getattr(bot, action)
method_to_call()

Et vous pouvez passer des arguments à la méthode de la manière habituelle:

getattr(bot, action)(argument1, argument2)

ou

method_to_call = getattr(bot, action)
method_to_call(argument1, argument2)

Je ne sais pas si elle applique dans votre situation, mais vous pouvez envisager d'utiliser un pointeur de fonction au lieu de manipuler les chaînes.

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)

Ce qui imprime:

fightin
working

Si vous pouvez le faire, il vous donnera une erreur sur une fonction mal orthographié à la compilation lorsque le code est interprété au lieu de cours d'exécution. Cela pourrait raccourcir votre cycle de débogage pour les erreurs de saisie des données stupides, surtout si les actions sont effectuées sur une période de temps. Rien ne suce plus que de courir la nuit quelque chose et de découvrir que vous avez eu une erreur de syntaxe dans la matinée.

class Scheduler:
    def schedule_action(self,action):
       bot = Bot()
       boundmethod = getattr(bot, action)
       boundmethod()
def schedule_action(self,action):
         bot = Bot()
         bot.__getattribute__(action)()

Vous pouvez également utiliser un dictionnaire pour cartographier les méthodes d'actions. Par exemple:

ACTIONS = {"fight": Bot.fight,
           "walk": Bot.walk,}

class Scheduler:
    def schedule_action(self, action):
        return ACTIONS[action](Bot())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top