Как вызвать метод для нескольких объектов с одинаковыми именами и одинакового типа? - PullRequest
0 голосов
/ 07 ноября 2018

Как можно упростить этот код, предпочтительно поместить его в цикл или одну строку?

object1.callMethod()  
object2.callMethod()  
object3.callMethod()  

difObject1.callDifMethod()  
difObject2.callDifMethod()  
difObject3.callDifMethod()  

Я знаю, что могу поместить объекты в список и выполнить итерацию по нему, однако для этого все равно потребуются два отдельных цикла и два отдельных списка. Можно ли как-нибудь составить единый список из [1,2,3] и использовать его для различения трех различных объектов каждого типа, поскольку числа также присутствуют в именах объектов?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018
getattr(object, method_name)()

Если все имена методов и объектов, как правило, семантические, вы можете использовать getattr для ссылки на метод, основанный на строковой переменной, а затем вызвать его с помощью ().

objects = [object1, object2, object3]
for object in objects:
    getattr(object, method_name)()

Если вы хотите запустить объекты / метод параллельно, используйте zip.

objects = [object1, object2, object3]
methods = ['method1name', 'method2name', 'method3name']
for object, method in zip(objects, methods):
    getattr(object, method)()
0 голосов
/ 07 ноября 2018

Вы можете использовать словарный подход:

methods = {cls1.method1: [cls1_obj1, cls1_obj2, cls1_obj3],
           cls1.method2: [cls1_obj4, cls1_obj5, cls1_obj6],
           cls2.method1: [cls2_obj1, cls2_obj2}

for method, objs in methods.items():
    for obj in objs:
        method(obj)

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

Я не уверен, что есть что-то элегантное, что не включает в себя предопределение кратных (или комбинаций) lists и dicts и цикл по нему, так как вам нужно было бы явно указать, в каком объекте выполняется какие методы, определение требуется в любом случае.


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

# Instead of this
object1 = Foo(1)
object2 = Foo(2)
object3 = Foo(3)
...

# do this
foos = [Foo(i) for i in range(3)]

# Or this
bars = {name: Bar(name) for name in list_of_names}

Тогда манипулировать ими в группе становится тривиально:

for foo in foos:
    foo.foo_method()

for bar in bars.values():
    bar.bar_method()

Хотя по-прежнему легко ссылаться на объект самостоятельно:

foo[index].foo_method()
bar[key].bar_method()
0 голосов
/ 07 ноября 2018

Вы можете использовать функцию eval:

>>> for i in range(1,4):
>>>     eval("object%d" % i).callMethod()
>>>     eval("difObject%d" % i).callDifMethod()
...