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?
-
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')
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é
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())