我应该如何简化此代码,最好将其放入循环或一行中?
object1.callMethod()
object2.callMethod()
object3.callMethod()
difObject1.callDifMethod()
difObject2.callDifMethod()
difObject3.callDifMethod()
我知道我可以将对象放在列表中并进行迭代,但是,仍然需要两个单独的循环和两个单独的列表。我有什么办法可以制作一个[1,2,3]的单数列表,并用它来区分每种类型的三个不同的对象,因为数字也在对象名称中?
答案 0 :(得分:1)
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)()
答案 1 :(得分:1)
您可以使用字典方法:
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
的倍数(或组合)并在其上循环,因为您需要明确地在哪个对象上运行哪种方法都需要定义。
理想情况下,如果您有多个相同类的对象,则可以选择从get go的列表中实例化它们:
# 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()
答案 2 :(得分:0)
您可以使用eval
函数:
>>> for i in range(1,4):
>>> eval("object%d" % i).callMethod()
>>> eval("difObject%d" % i).callDifMethod()