O script python está em execução. Eu tenho um nome de método como uma string. Como eu chamo esse método?

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

  •  23-09-2019
  •  | 
  •  

Pergunta

todos. Por favor, veja o exemplo abaixo. Eu gostaria de fornecer uma string ao método 'schedion_action' que especifica, qual o método da classe bot deve ser chamado. No exemplo abaixo, eu o representei como 'bot.action ()', mas não tenho idéia de como fazê -lo corretamente. Por favor ajude

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

Solução

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

Observe que o GetATTR também leva um argumento opcional que permite retornar um valor padrão caso a ação solicitada não exista.

Outras dicas

Resumidamente,

getattr(bot, action)()

GetAttr procurará um atributo no objeto pelo nome - os atributos podem ser dados ou métodos de membro o extra () No final, chama o método.

Você pode obter o método em uma etapa separada, assim também:

method_to_call = getattr(bot, action)
method_to_call()

E você pode passar argumentos para o método da maneira usual:

getattr(bot, action)(argument1, argument2)

ou

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

Não tenho certeza se isso se aplica à sua situação, mas você pode considerar usar um ponteiro de função em vez de manipular as cordas.

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)

Quais impressões:

fightin
working

Se você puder fazer isso, isso lhe dará um erro sobre uma função incorreta em tempo de compilação Quando o código é interpretado em vez de durante o tempo de execução. Isso pode reduzir seu ciclo de depuração para erros estúpidos de entrada de dados, especialmente se as ações forem realizadas ao longo de um período de tempo. Nada é péssimo mais do que executar algo da noite para o dia e descobrir que você teve um erro de sintaxe pela manhã.

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

Você também pode usar um dicionário para mapear métodos para ações. Por exemplo:

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

class Scheduler:
    def schedule_action(self, action):
        return ACTIONS[action](Bot())
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top