2017-02-08 19 views
0

У меня есть список объектов того же класса и вы хотите выполнить список методов один за другим.Выполнение списка методов со списком объектов

F.e.

objectlist = [ obj1, obj2, obj3, ...] 
methodlist = [ obj(?).returnstring(para1), obj(?).returnint(para2,subpara1), ...] 

for i in range(len(objectlist)): 
    for n in range(len(methodlist)): 
     value = obj[i].methodlist[n] 
     print(value) 

Я просто этот грязный обходной путь:

objectlist = [ obj1, obj2, obj3, ...] 
i = 0 
methodlist = [ objectlist[i].returnstring(para1), objectlist[i].returnint(para2,subpara1), ...] 

for i in range(len(objectlist)): 
    for n in range(len(methodlist)): 
     value = obj[i].methodlist[n] 
     print(value) 

Ну ... это работает, но я получаю животик с этим решением.

Есть ли лучший способ сделать это?

здоровается,

Zonk

+0

Ваш обходной путь делает ** ** не работа, это только будет вызывать ** на первый элемент ** , –

ответ

2

Ваше обходное решение не работы, он только будет звонить на первый элемент. Начиная с i = 0, он будет оценить мгновенно.

Вы можете использовать лямбда-выражения для этого:

objectlist = [ obj1, obj2, obj3, ...] 
methodlist = [lambda obj:obj.returnstring(para1), lambda obj:obj.returnint(para2,subpara1), ...] 

Так вот methodlist содержит список лямбда-выражений вида:

lambda obj:obj.returnstring(para1) 

лямбда-выражение является анонимная функция, который здесь принимает в качестве входного параметра obj и * возвращает obj.returnstring(para1) на этом объекте. Таким образом, более или менее эквивалентно:

def afunction(obj): 
    return obj.returnstring(para1) 

Теперь вы можете просто пройти по списку объектов и методов и называют лямбда-выражение с параметром и сделать что-то с результатом. Как:

for i in range(len(objectlist)): 
    for n in range(len(methodlist)): 
     value = methodlist[n](obj[i]) 
     print(value) 

Но это более элегантно петли сразу над вашими элементами, как:

for obji in objectlist: 
    for methn in methodlist: 
     value = methn(obji) 
     print(value) 
+0

Ну, он все еще «работает». Да, я вызываю первый элемент в моем списке, но позже «i» получает новое значение в цикле for. В моем проекте я проверяю до этого момента, если список существует. Но что бы это ни было, это неправильно и грязно. : ^) Мне никогда не приходилось что-либо делать с лямбдами, но завтра я попробую. – zonk

+0

Да, это прекрасно работает. :) Спасибо! – zonk

0

немного менее грязным, но все еще не большого

objectlist = [ obj1, obj2, obj3, ...] 
i = 0 

for m_obj in objectlist: 
    i=i+1 
    methodlist = [ objectlist[i].returnstring(para1), objectlist[i].returnint(para2,subpara1), ...] 

    for m_method in methodlist: 
     value = m_obj.m_method() 
     print(value) 

это использует "хорошие" циклические функции Python, а также переопределяет свои методы для каждого объекта (не необходимо, так как все обживы одного класса, но все же хорошая практика)

+0

Ну, как правило, я должен иметь дело с C или C++, поэтому для меня это немного странно. ^^ – zonk

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

  • Нет связанных вопросов^_^