繁体   English   中英

Python脚本正在运行。我有一个方法名称作为字符串。我该如何调用此方法?

[英]Python script is running. I have a method name as a string. How do I call this method?

大家。 请参阅下面的示例。 我想为'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')

使用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将按名称查找对象的属性 - 属性可以是数据或成员方法最后的extra ()调用该方法。

您可以在单独的步骤中获取该方法,如下所示:

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM