6

私は次のクラスを持っています。

func_list= ["function1", "function2", "function3"]

class doit(object):
    def __init__(self):
        for item in func_list:
            if item == "function1":
                self.function1()
            elif item == "function2":
                self.function2()
            elif item == "function3":
                self.function3()

    def function1(self):
        #do this
        pass
    def function2(self):
        #do that
        pass
    def function3(self):
        pass

このクラスのインスタンスが作成されると、文字列のリストを反復処理し、実際の文字列に応じてメソッドを呼び出します。リスト内の文字列には、対応するメソッドの名前が含まれています。

よりエレガントな方法でこれを行うにはどうすればよいですか? elifリストに追加するすべての「関数」に別の -path を追加したくありません。

4

5 に答える 5

13
func_list= ["function1", "function2", "function3"]

class doit(object):
    def __init__(self):
        for item in func_list:
            getattr(self, item)()
    def function1(self):
        print "f1"
    def function2(self):
        print "f2"
    def function3(self):
        print "f3"



>>> doit()
f1
f2
f3

プライベート関数の場合:

for item in func_list:
     if item.startswith('__'):
         getattr(self, '_' + self.__class__.__name__+ item)()
     else:
         getattr(self, item)()

.

getattr(object, name[, default])

object の指定された属性の値を返します。name は文字列でなければなりません。文字列がオブジェクトの属性の 1 つの名前である場合、結果はその属性の値になります。たとえば、getattr(x, 'foobar') は x.foobar と同等です。指定された属性が存在しない場合、指定されている場合は default が返され、そうでない場合は AttributeError が発生します。

http://docs.python.org/library/functions.html#getattr

于 2012-07-25T12:39:47.257 に答える
2

Python では関数が第一級のデータ型であるため、これは通常、辞書検索で解決されます。例えば:

# map string names to callable functions
dispatch = {'func1': func1, 'func2': func2, ...}

want_to_call = 'func1'
dispatch[want_to_call](args)
于 2012-07-25T13:14:56.390 に答える
1

なぜラムダを使わないのですか?

というように、

def func1(a):
    return a ** 2

def func2(a, b):
    return a ** 3 + b

dic = {'Hello':lambda x: func1(x), 'World':lambda x,y: func2(x, y)} #Map functions to lambdas
print dic['Hello'](3)
print dic['World'](2,3)

出力、9 11

または、これを行うことができます...

class funs():
    def func1(self, a):
        return a ** 2

    def func2(self, a, b):
        return a ** 3 + b

f = funs()
dic = {'Hello': lambda x: f.func1(x), 'World': lambda x,y: f.func2(x,y)}
print dic['Hello'](3)
print dic['World'](5,4)

9 129、あなたにあげます

于 2012-07-25T13:32:26.070 に答える
0
class doit(object):
    def __init__(self, func_list):
        for func in func_list:
            func(self)
    #insert other function definitions here

func_list = [doit.function1, doit.function2, doit.function3]
foo = doit(func_list)
于 2012-07-25T13:02:43.913 に答える
-2

プログラムをよりシンプルで短くする eval を使用できます。

list= ["function1", "function2", "function3"]

class doit(object):
    def __init__(self):
        for item in list:
            eval(item)()
    def function1(self):
        print "f1"
    def function2(self):
        print "f2"
    def function3(self):
            print "f3"
于 2012-07-25T13:18:15.353 に答える