2014-01-16 33 views
3

多个实例,有这样的事情:调用方法对在Python

a,b,c = a,b,c.method() 

这只是一个例子,我想知道这样做

+3

好吧,是'A,B,C =(x.method()for x in(a,b,c))'够了吗? – bereal

+2

为了清楚起见,您想要将每个对象调用'method()'的结果返回给对象本身? –

+0

为什么不使用列表? 'l2 = [x.method()for x in l1]'可能是一个很好的方法来做你需要的。 – user2357112

回答

7

不完全是短期的最短途径,但如果我理解你正确的,这将工作:

a, b, c = (x.method() for x in (a, b, c)) 

(注意,这如果a,bc指的是同一个对象,该方法将被调用几次)。

5

不短。但是这里有一个使用operator.methodcaller的替代方案。

a, b, c = map(operator.methodcaller('method'), (a,b,c)) 

例子:

>>> import operator 
>>> a, b, c = [1,2,3], [4,5,6], [7,8,9] 
>>> a, b, c = map(operator.methodcaller('pop'), (a,b,c)) 
>>> a 
3 
>>> b 
6 
>>> c 
9 

>>> m = operator.methodcaller('pop') # If you call `method` multiple times, 
            # keep a reference to the methodcaller 
>>> a, b, c = [1,2,3], [4,5,6], [7,8,9] 
>>> a, b, c = map(m, (a,b,c)) 
>>> a 
3 
>>> b 
6 
>>> c 
9 

如果所有的对象都是同一类型的,你可以使用未绑定的方法。例如a,b,c这里是所有列表实例。所以你可以使用list.pop而不是operator.methodcaller('pop')

例如:

>>> a, b, c = [1,2,3], [4,5,6], [7,8,9] # a, b, c are all `list` objects. 
>>> a, b, c = map(list.pop, (a,b,c)) 
>>> a 
3 
>>> b 
6 
>>> c 
9 
+3

'__neg__'不是一个很好的例子 - 在这种情况下,最好使用'operator.neg'。尽管如此,+1。 – glglgl

+0

@glglgl,我更新了代码以使用'pop'方法。 – falsetru

+0

糟糕! 'a,b,c = map(list.pop,(a,b,c))'是可能的。 – falsetru

1

使用发电机将是最简单的方法。例如,如果A,B和C字符串:

a, b, c = 'asdf', 'quer', 'zxcv' 

而且你希望利用每个字符串的开头,你可以这样做:

a, b, c = (x.capitalize() for x in (a, b, c)) 
+2

这个方法已经由贝雷尔建议。请不要在没有提供额外信息的情况下复制答案。 – falsetru

+0

对不起。每个人都应该在原始问题的评论中寻找由贝瑞尔提出的广义解决方案 – karl124