Скрипт Python работает.У меня есть имя метода в виде строки.Как я называю этот метод? - PullRequest
5 голосов
/ 26 февраля 2010

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

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

Ответы [ 6 ]

12 голосов
/ 26 февраля 2010

Использование 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 голосов
/ 26 февраля 2010

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

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)
6 голосов
/ 26 февраля 2010

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

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

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

3 голосов
/ 26 февраля 2010
class Scheduler:
    def schedule_action(self,action):
       bot = Bot()
       boundmethod = getattr(bot, action)
       boundmethod()
1 голос
/ 27 февраля 2010

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

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

class Scheduler:
    def schedule_action(self, action):
        return ACTIONS[action](Bot())
1 голос
/ 26 февраля 2010
def schedule_action(self,action):
         bot = Bot()
         bot.__getattribute__(action)()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...