我有以下课程。
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
- 路径。
答案 0 :(得分:12)
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的named属性的值。 name必须是一个字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x,'foobar')等同于x.foobar。如果named属性不存在,则返回default(如果提供),否则引发AttributeError。
答案 1 :(得分:2)
这通常通过字典查找来解决,因为函数是Python中的第一类数据类型。例如:
# map string names to callable functions
dispatch = {'func1': func1, 'func2': func2, ...}
want_to_call = 'func1'
dispatch[want_to_call](args)
答案 2 :(得分:1)
你为什么不使用lambdas?
比如说,
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
答案 3 :(得分: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)
答案 4 :(得分:-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"