从另一个文件和另一个类调用未指定的函数

时间:2014-01-11 01:38:17

标签: python function class

我试图从另一个类调用一个不确定的命名函数。我的意思是,外部输入或循环中的变量作为函数名称。

例如;

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>}中的

我应该在大胆的地方放些什么?有没有办法将函数名和数字组合起来才能调用函数。

我几天来一直在寻找这个问题的解决方案,但我找不到任何相关的解决方案。

3 个答案:

答案 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 namesWhy you don't want to dynamically create variables,了解为何这通常是一个坏主意。

现在,如果这些函数具有您实际将在代码中静态调用的有用名称,那将是一个不同的故事。但事实上,他们被称为function1function2等,并且您希望以某种方式称呼它们options.function**"num"**(),这意味着确实如此。

所以,答案与其他地方的答案相同:将内容放入listdict,然后从那里查找。

忘记给这些东西提供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