Pythonスクリプトが実行されています。文字列としてメソッド名があります。この方法を呼び出すにはどうすればよいですか?

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

  •  23-09-2019
  •  | 
  •  

質問

みんな。以下の例をご覧ください。文字列を指定する「schedule_action」メソッドに文字列を提供したいと思います。ボットクラスのメソッドを呼び出す必要があります。以下の例では、「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