大家.请参阅下面的示例.我想为'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')
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 12
使用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')
Run Code Online (Sandbox Code Playgroud)
请注意,getattr还采用可选参数,允许您在请求的操作不存在时返回默认值.
简而言之,
getattr(bot, action)()
Run Code Online (Sandbox Code Playgroud)
getattr将按名称查找对象的属性 - 属性可以是数据或成员方法最后的额外()调用方法.
您可以在单独的步骤中获取该方法,如下所示:
method_to_call = getattr(bot, action)
method_to_call()
Run Code Online (Sandbox Code Playgroud)
并且您可以通常的方式将参数传递给方法:
getattr(bot, action)(argument1, argument2)
Run Code Online (Sandbox Code Playgroud)
要么
method_to_call = getattr(bot, action)
method_to_call(argument1, argument2)
Run Code Online (Sandbox Code Playgroud)
我不确定它是否适用于您的情况,但您可以考虑使用函数指针而不是操纵字符串.
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)
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
fightin
working
Run Code Online (Sandbox Code Playgroud)
如果您可以这样做,它将在编译时解释代码而不是在运行时期间给出错误的拼写错误函数.这可能会缩短您的愚蠢数据输入错误的调试周期,特别是如果操作在一段时间内完成.没有什么比在一夜之间运行的东西更糟糕了,并发现你早上有语法错误.