Сценарий Python работает. У меня есть имя метода в качестве строки. Как мне назвать этот метод?
-
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())