15

次のようなクラスのメソッドをリストするタプルがあります。

t = ('methA','methB','methC','methD','methE','methF')

等々..

ここで、ユーザーが行った選択に基づいてこれらのメソッドを動的に呼び出す必要があります。メソッドは、インデックスに基づいて呼び出されます。したがって、ユーザーが '0' を選択するとmethAが呼び出され、'5'を選択するmethFと が呼び出されます。

これを行うための私の方法は次のとおりです。

def makeSelection(self, selected):
    #methodname = t[selected]
    #but as this is from  within the class , it has to be appended with 'self.'methodname
    # also need to pass some arguments locally calculated here

私は何かを解決することができましたevalが、エラーが発生し、まったくエレガントではありません。

4

1 に答える 1

36

オブジェクト (インポートされたモジュールを含む) でメソッドを呼び出す場合は、次を使用できます。

getattr(obj, method_name)(*args) #  for this question: use t[i], not method_name

例えば:

>>> s = 'hello'
>>> getattr(s, 'replace')('l', 'y')
'heyyo'

現在のモジュールで関数を呼び出す必要がある場合

getattr(sys.modules[__name__], method_name)(*args)

whereargsは、送信する引数のリストまたはタプルです。または、他の関数と同様に、呼び出しでそれらをリストすることもできます。同じオブジェクトで別のメソッドを呼び出そうとしているメソッドにいるのでself、代わりに最初のものを使用しますobj

getattrはオブジェクトと文字列を取り、オブジェクト内で属性検索を行い、存在する場合は属性を返します。 obj.xそしてgetattr(obj, 'x')同じ結果を達成します。この種の反射をさらに調べたい場合はsetattr、 、hasattr、および関数もあります。delattr



完全に別のアプローチ:
この回答がどれだけの注目を集めているかに気づいた後、私はあなたがしていることに対して別のアプローチを提案するつもりです. 私はいくつかの方法が存在すると仮定します

def methA(*args): print 'hello from methA'
def methB(*args): print 'bonjour de methB'
def methC(*args): print 'hola de methC'

各メソッドを番号 (選択) に対応させるために、番号をメソッド自体にマッピングする辞書を作成します。

id_to_method = {
    0: methA,
    1: methB,
    2: methC,
}

これを考えると、id_to_method[0]()を呼び出しmethAます。これは 2 つの部分からなり、最初はid_to_method[0]辞書から関数オブジェクトを取得し、次にそれを()呼び出します。実際のコードでは、引数を渡すこともできid_to_method[0]("whatever", "args", "I", "want) ます。上記を考えると、おそらく次のようなものになるでしょう

choice = int(raw_input('Please make a selection'))
id_to_method[choice](arg1, arg2, arg3) # or maybe no arguments, whatever you want
于 2013-07-18T21:59:17.900 に答える