【问题标题】:create multiple objects of a class with different arguments创建具有不同参数的类的多个对象
【发布时间】:2014-06-12 19:00:53
【问题描述】:

我知道如何使用循环创建同一类的多个对象,类似于这个 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 

【问题讨论】:

    标签: python


    【解决方案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】:

      您可以做的一件事是创建一个包含所有新 MyClass 对象的列表,如下所示:

      class_objects = []
      for o in objects.values():
          class_objects.append(MyClass(o[0], o[1], o[2]))
      

      这会生成一个名为 class_objects 的列表,其中包含文件中的所有 MyClass 对象。

      【讨论】:

        【解决方案3】:
        >>> 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>]
        

        【讨论】:

        • 如果文件中的名称很重要,我会使用字典而不是列表:instances = { name: MyClass(*args) for name, args in objects.items()}
        • 在你的最后一行中不需要name: MyClass(*args) for args in object.values()
        • 非常感谢!!这就像一个魅力......如果我想发送一个对象作为另一个对象的参数......例如:在我写的正常编码中...... obj1 = MyClass('object1','Tom ',10) obj2 = MyClass('object2','John',obj1)...这里怎么引用?
        猜你喜欢
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 2013-09-19
        • 2018-04-12
        • 1970-01-01
        相关资源
        最近更新 更多