从另一个文件和另一个类调用未指定的函数
这个问题在这里已经有了答案:
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
是该对象的某个属性。
这与动态创建和访问变量非常相似,即使这些变量恰好是函数而不是整数。 请参阅将数据保留在变量名称之外,并且为什么您不想动态创建变量以了解为什么这通常是一个糟糕的主意。
现在,如果这些函数具有实际上将在代码中静态调用的有用名称,那将是一个不同的故事。 但事实上他们被称为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
。 你怎么解决这个问题? 随着装饰。 这可能有点太高级了,你不能自己想出来,细节将取决于你如何真正想要使用这些东西(从你的问题中不明确,给定那些方法 - 没有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