我有一个相当复杂的逻辑,幸运的是可以分为几个案例,每个案例都用一个方法实现,所有方法都有相同的参数并返回相同的值。为了避免难看的 if/elif 序列,我想通过索引数组来调用该方法,其中包含要处理的大小写。我可以做这样的事情:
class SomeClass(object):
def __init__(self,name):
self.name=name
def method0(self,arg):
print 'method0(%s,%s)' % (self.name,arg)
def method1(self,arg):
print 'method1(%s,%s)' % (self.name,arg)
def method(self,i,arg):
methods=[self.method0,self.method1]
methods[i](arg)
foo=SomeClass('foo')
bar=SomeClass('bar')
foo.method(0,'covfefe')
bar.method(1,'covfefe')
但是,这会将数组值绑定到实例。出于好奇,我想知道是否有一种方法可以在数组中使用未绑定的方法:methods=[method0,method1]
并在调用时将它们绑定到实例。像 self.methods[case](args)
这样的语法不起作用(以这种方式初始化数组也不起作用......
这听起来像是"变量变量"问题的一个案例。所以让我们滥用getattr()
:
foo=SomeClass('foo')
bar=SomeClass('bar')
getattr(foo, 'method'+'0')('covfefe')
getattr(bar, 'method'+'1')('covfefe')
如果你知道你有一系列foo, bar
:
series = (
{'inst': SomeClass('foo'), 'i': 0},
{'inst': SomeClass('bar'), 'i': 1})
for _ in series:
getattr(_['inst'], 'method'+ str(_['i']))('covfefe')
我相信你可以在你的班级定义中坚持getattr
:
def method(self,i,arg):
L = ['method1','method2','method3']
getattr(self, L[i])(arg)