Сценарий Python работает. У меня есть имя метода в качестве строки. Как мне назвать этот метод?

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

  •  23-09-2019
  •  | 
  •  

Вопрос

каждый. См. Пример ниже. Я хотел бы поставить строку для метода «график_акции», который указывает, как следует вызвать метод класса 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')
Это было полезно?

Решение

Использовать 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 также принимает необязательный аргумент, который позволяет вернуть значение по умолчанию в случае, если запрошенное действие не существует.

Другие советы

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

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)

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

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

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

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

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

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

class Scheduler:
    def schedule_action(self, action):
        return ACTIONS[action](Bot())
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top