2010-02-26 2 views
5

все. См. Пример ниже. Я хотел бы предоставить строку методу «sched_action», который указывает, какой метод Bot-класса следует вызывать. В приведенном ниже примере я представлял его как «bot.action()», но я не знаю, как это сделать правильно. Пожалуйста, помогитеВыполняется скрипт Python. У меня есть имя метода как строка. Как мне назвать этот метод?

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

ответ

13

Использование 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') 

Обратите внимание, что getattr также принимает необязательный аргумент, который позволяет вернуть значение по умолчанию в случае, если запрошенное действие не существует.

7

Короче говоря,

getattr(bot, action)() 

GetAttr будет искать атрибут на объект по названию - атрибуты могут быть данные или методы членов Дополнительного () в конце вызывает метод.

Вы можете получить метод на отдельном этапе, как это, а также:

method_to_call = getattr(bot, action) 
method_to_call() 

И вы можете передать аргументы метода обычным способом:

getattr(bot, action)(argument1, argument2) 

или

method_to_call = getattr(bot, action) 
method_to_call(argument1, argument2) 
3
class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     boundmethod = getattr(bot, action) 
     boundmethod() 
6

Я не уверен, если это применимо в вашей ситуации, но вы можете рассмотреть возможность использования указателя на функцию вместо того, чтобы манипулировать строками.

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) 

который печатает:

fightin 
working 

Если вы можете сделать это, он даст вам ошибку о орфографической ошибкой функции во время компиляции когда код интерпретируется а не во время выполнения , Это может сократить цикл отладки для глупых ошибок ввода данных, особенно если действия выполняются в течение определенного промежутка времени. Ничто не засасывает больше, чем что-то запускать, и обнаруживает, что утром у вас была синтаксическая ошибка.

+0

Обязательно рассмотрите эту опцию. Если вы хотите динамически выбирать метод для вызова, это может быть правильным вариантом для вас. Используйте только опции 'getattr', если вы произвольно генерируете это имя (например, читаете его из файла, из сокета или из пользовательского ввода). – Wesley

+1

Истинно, что он даст ошибку ранее в описанной вами ситуации, но ошибка не во время компиляции. –

+0

ах, ты прав. сообщение отредактировано. –

1

Вы также можете использовать словарь для сопоставления методов действиям. Например:

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

class Scheduler: 
    def schedule_action(self, action): 
     return ACTIONS[action](Bot())