script Python è in esecuzione. Ho un nome di metodo come una stringa. Come chiamare questo metodo?

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

  •  23-09-2019
  •  | 
  •  

Domanda

tutti. Si prega di vedere l'esempio di seguito. Mi piacerebbe per la fornitura di una stringa per il metodo 'schedule_action' che specifica, quale metodo Bot classe dovrebbe essere chiamato. Nell'esempio che segue ho rappresentato come 'bot.action ()', ma non ho idea di come farlo correttamente. Si prega di aiutare

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')
È stato utile?

Soluzione

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

Si noti che anche GetAttr prende un argomento opzionale che consente di restituire un valore di default nel caso in cui l'azione richiesta non esiste.

Altri suggerimenti

In breve,

getattr(bot, action)()

getattr cercherà un attributo sull'oggetto per nome -. Attributi possono essere dati o metodi membri La () extra alla fine chiama il metodo

Si potrebbe ottenere il metodo in una fase separata, in questo modo, così:

method_to_call = getattr(bot, action)
method_to_call()

E si può passare argomenti al metodo nel solito modo:

getattr(bot, action)(argument1, argument2)

o

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

Non sono sicuro se si applica nella vostra situazione, ma si può considerare l'utilizzo di un puntatore a funzione, invece di manipolare le stringhe.

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)

che stampa:

fightin
working

Se si può fare questo, vi darà un errore su una funzione errata al momento della compilazione quando il codice è interpretato invece che in fase di esecuzione. Questo potrebbe accorciare il ciclo di debug per gli errori di immissione dati stupidi, soprattutto se le azioni sono fatte in un arco di tempo. Niente succhia più che correre qualcosa durante la notte e scoprire che si ha un errore di sintassi nella mattina.

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

È inoltre possibile utilizzare un dizionario per mappare metodi per azioni. Per esempio:

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

class Scheduler:
    def schedule_action(self, action):
        return ACTIONS[action](Bot())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top