按字符串调用方法

wew*_*ewa 6 python python-2.5

我有以下课程.

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
Run Code Online (Sandbox Code Playgroud)

如果创建了此类的实例,它将遍历字符串列表并根据实际字符串调用方法.列表中的字符串具有相应方法的名称.

我怎样才能以更优雅的方式做到这一点?我不想为elif我添加到列表中的每个"函数" 添加另一个路径.

app*_*tor 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
Run Code Online (Sandbox Code Playgroud)

对于私人功能:

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

.

getattr(object, name[, default])
Run Code Online (Sandbox Code Playgroud)

返回object的named属性的值.name必须是一个字符串.如果字符串是对象属性之一的名称,则结果是该属性的值.例如,getattr(x,'foobar')等同于x.foobar.如果named属性不存在,则返回default(如果提供),否则引发AttributeError.

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

  • 如果您提到魔术是在`getattr`函数中完成并提供了文档的链接,我认为这个答案会稍好一些. (2认同)