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

这个问题在这里已经有了答案:

  • 通过使用其名称(字符串)调用模块的功能10个答案

  • 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
    

    以下是一种方法:

    function_num = getattr(options, 'function'+str(num))
    function_num()
    

    这使用getattr内建函数。 getattr(a, 'b')等价于ab ,其中a是某个对象, b是该对象的某个属性。


    这与动态创建和访问变量非常相似,即使这些变量恰好是函数而不是整数。 请参阅将数据保留在变量名称之外,并且为什么您不想动态创建变量以了解为什么这通常是一个糟糕的主意。

    现在,如果这些函数具有实际上将在代码中静态调用的有用名称,那将是一个不同的故事。 但事实上他们被称为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 。 你怎么解决这个问题? 随着装饰。 这可能有点太高级了,你不能自己想出来,细节将取决于你如何真正想要使用这些东西(从你的问题中不明确,给定那些方法 - 没有self定义),但一旦你明白了这个想法,它就非常灵活,并不那么难:

    _optfunctions = []
    class Options(object):
        functions = _optfunctions
        def add(func):
            _optfunctions.append(func)
            return func
        @add
        def function1(self): pass
        @add
        def function2(self): pass
        @add
        def function3(self): pass
        del add
    del _optfunctions
    
    链接地址: http://www.djcxy.com/p/55175.html

    上一篇: Calling unspecified function from another file and another class

    下一篇: How to assign class method to class attribute?