在方法数组上使用索引调用方法

2024-09-27 21:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当复杂的逻辑,幸运的是可以分为几个案例,每个案例都用一个方法实现,所有方法都有相同的参数和返回相同的值。为了避免一个难看的if/elif序列,我想通过索引一个包含要处理的case的数组来调用该方法。我可以这样做:

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)这样的语法不起作用(以这种方式初始化数组也不起作用…)


Tags: 方法nameselffoodefargbar数组
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:03

这听起来像是“变量”问题的一个例子。所以让我们滥用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)

相关问题 更多 >

    热门问题