我知道如何使用循环创建同一类的多个对象,类似于此 How to create multiple class objects with a loop in python? 但是,我想要的是不同的,因为每个对象必须用不同的参数初始化 我的程序现在从文件中读取所有信息(参数)并将它们存储在python字典中,如下所示:
objects={'obj1':['object1','Tom',10],'obj2':['object2','John',13]}
并且因为所需对象的数量取决于文件中找到的信息。 我想知道是否有一种方法可以自动创建(可能通过使用循环!)多个类对象并使用不同的参数初始化它们。而不是按如下方式声明它们:
obj1 = MyClass('object1','Tom',10)
obj2 = MyClass('object2','John',13)
.
.
.
etc
答案 0 :(得分:4)
>>> objects={'obj1':['object1','Tom',10],'obj2':['object2','John',13]}
>>> instances = []
>>> for name, args in objects.items():
inst = MyClass(*args)
instances.append(inst)
或直接:
>>> [MyClass(*args) for name, args in objects.items()]
[<MyClass: object1, Tom, 10>, <MyClass: object2, John, 13>]
甚至更简单,忽略名称:
>>> [MyClass(*args) for args in objects.values()]
[<MyClass: object1, Tom, 10>, <MyClass: object2, John, 13>]
或返回字典(在Python 2.7 +中工作)
>>> {name: MyClass(*args) for name, args in objects.items()}
{'obj1': <MyClass: object1, Tom, 10>, 'obj2': <MyClass: object2, John, 13>}
如果您有用于创建实例的动态数量的参数(假设您的类构造函数可以处理此变量编号 - 使用默认值),这甚至可以工作。
使用itertools.starmap
>>> from itertools import starmap
>>> list(starmap(MyClass, objects.values())
[<MyClass: object1, Tom, 10>, <MyClass: object2, John, 13>]
答案 1 :(得分:1)
objects={'obj1':['object1','Tom',10],'obj2':['object2','John',13]}
class MyClass():
def __init__(self, var1, var2, var3, *args):
self.var1 = var1
self.var2 = var2
self.var3 = var3
for i in objects.keys():
my_class = MyClass(*objects[i])
print my_class.__dict__
{'var1': 'object1', 'var3': 10, 'var2': 'Tom'}
{'var1': 'object2', 'var3': 13, 'var2': 'John'}
答案 2 :(得分:0)
您可以做的一件事是创建一个包含所有新MyClass
个对象的列表,如下所示:
class_objects = []
for o in objects.values():
class_objects.append(MyClass(o[0], o[1], o[2]))
这会生成一个名为class_objects
的列表,其中包含文件中的所有MyClass
个对象。