El script de Python se está ejecutando. Tengo un nombre de método como cadena. ¿Cómo llamo a este método?

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

  •  23-09-2019
  •  | 
  •  

Pregunta

todo el mundo. Consulte el ejemplo a continuación. Me gustaría suministrar una cadena al método 'programar_accion' que especifica, cómo se debe llamar al método de clase BOT. En el siguiente ejemplo, lo he representado como 'Bot.Action ()' pero no tengo idea de cómo hacerlo correctamente. Por favor ayuda

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')
¿Fue útil?

Solución

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

Tenga en cuenta que GetATTR también toma un argumento opcional que le permite devolver un valor predeterminado en caso de que la acción solicitada no exista.

Otros consejos

En breve,

getattr(bot, action)()

getATTR buscará un atributo en el objeto por nombre: los atributos pueden ser datos o métodos de miembros. () Al final llama al método.

También podría obtener el método en un paso separado, como este:

method_to_call = getattr(bot, action)
method_to_call()

Y puede pasar argumentos al método de la manera habitual:

getattr(bot, action)(argument1, argument2)

o

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

No estoy seguro de si se aplica en su situación, pero puede considerar usar un puntero de funciones en lugar de manipular las cuerdas.

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)

Qué imprime:

fightin
working

Si puede hacer esto, le dará un error sobre una función mal escrita en tiempo de compilación Cuando el código se interpreta en lugar de durante el tiempo de ejecución. Esto podría acortar su ciclo de depuración para errores de entrada de datos estúpidos, especialmente si las acciones se realizan durante un período de tiempo. Nada apesta más que ejecutar algo durante la noche y descubrir que tuvo un error de sintaxis por la mañana.

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

También puede usar un diccionario para mapear los métodos de las acciones. Por ejemplo:

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

class Scheduler:
    def schedule_action(self, action):
        return ACTIONS[action](Bot())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top