2014-01-16 2 views
3

Есть ли что-то вроде этого:вызова метода на нескольких экземплярах в Python

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

?

Это просто пример, я хочу знать, самый короткий путь, чтобы сделать это

+3

Ну, 'а, б, в = (x.method() для x в (a, b, c)) 'достаточно хорошо? – bereal

+2

Чтобы быть понятным, вы хотите вернуть результаты вызова метода() 'на каждый объект обратно в сами объекты? –

+0

Почему бы не использовать списки? 'l2 = [x.method() для x в l1]' может быть хорошим способом сделать то, что вам нужно. – user2357112

ответ

7

Не совсем, что короткие, но если я понимаю, что вы исправить, это будет работать:

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

(Обратите внимание, что если a, b или c относятся к одному и тому же объекту, метод будет называться несколько раз).

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 и с были строки:

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

И вы хотите, чтобы капитализировать начало каждой строки, вы можете сделать:

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

Этот метод уже предложен по умолчанию. Пожалуйста, не дублируйте ответ, не предоставляя дополнительную информацию. – falsetru

+0

Извините. Все, пожалуйста, загляните в комментарии исходного вопроса для обобщенного решения – karl124

Смежные вопросы