我试图从另一个类调用一个不确定的命名函数。我的意思是,外部输入或循环中的变量作为函数名称。
例如;
class options(object):
def functionOne(): # or function1
pass
def functionTwo(): # or function2
pass
def functionThree(): # or function3
pass
在options.py文件中,并且:
class main(object):
def runSomething():
options=options()
while counter<=3:
options.function**"a"**()
counter = counter+1
或:
class main(object):
def runSomething():
options=options()
num=raw_input("number: ")
options.function**"num"**()
<{1>}中的。
我应该在大胆的地方放些什么?有没有办法将函数名和数字组合起来才能调用函数。
我几天来一直在寻找这个问题的解决方案,但我找不到任何相关的解决方案。
答案 0 :(得分:3)
这是一种方法:
function_num = getattr(options, 'function'+str(num))
function_num()
这使用getattr
内置函数。 getattr(a, 'b')
相当于a.b
,其中a
是某个对象,b
是该对象的某些属性。
答案 1 :(得分:2)
这与动态创建和访问变量非常相似,即使这些变量碰巧是函数而不是整数。请参阅Keep data out of your variable names和Why you don't want to dynamically create variables,了解为何这通常是一个坏主意。
现在,如果这些函数具有您实际将在代码中静态调用的有用名称,那将是一个不同的故事。但事实上,他们被称为function1
,function2
等,并且您希望以某种方式称呼它们options.function**"num"**()
,这意味着确实如此。
所以,答案与其他地方的答案相同:将内容放入list
或dict
,然后从那里查找。
忘记给这些东西提供self
参数这一事实意味着你只是将它们塞进class
中以便存放它们。在这种情况下......为什么不把它们放在一个列表中呢?例如:
class Options(object):
functions = []
def function1(self): pass
functions.append(function1)
def function2(self): pass
functions.append(function2)
def function3(self): pass
functions.append(function3)
class main(object):
def runSomething():
options=Options()
for counter in range(3):
options.functions[counter]()
当然,您不想在定义中键入function1
然后再在functions.append
中重复自己。你怎么解决这个问题?有一个装饰。这可能有点太高级了,你无法自己弄清楚,细节将取决于你实际上想要如何使用这些东西(从你的问题不清楚,给定这些方法 - 没有 - {{1} }定义),但是一旦你明白这个想法它就非常灵活而且不那么难:
self
答案 2 :(得分:1)
class Options(object):
def functionOne(self): # or function1
print 'one'
def functionTwo(self): # or function2
print 'two'
def functionThree(self): # or function3
print 'three'
o = Options()
for name in dir(o):
if 'function' in name:
getattr(o, name)()
执行时,上述结果为:
one
three
two
以部分名称选择性地运行函数:
def run_it(o, partial):
for name in dir(o):
if partial in name:
getattr(o, name)()
这可以用作:
>>> run_it(o, 'One')
one
>>> run_it(o, 'nTwo')
two