【问题标题】:How to create multiple class objects with a loop in python?如何在python中使用循环创建多个类对象?
【发布时间】:2014-03-03 03:50:55
【问题描述】:

假设你必须在 python 中创建 10 个类对象,并用它们做一些事情,比如:

obj_1 = MyClass()
other_object.add(obj_1)
obj_2 = MyClass()
other_object.add(obj_2)
.
.
.
obj_10 = MyClass()
other_object.add(obj_10)

你会如何使用循环,并为每个对象分配一个变量(如obj_1),这样代码会更短?每个对象都应该可以在循环外访问

obj_1.do_sth()

【问题讨论】:

标签: python class object


【解决方案1】:

这个问题每天都会以不同的方式被问到。答案是:把你的数据放在变量名之外,this is the obligatory blog post

在这种情况下,为什么不做一个 obj 列表呢?

objs = [MyClass() for i in range(10)]
for obj in objs:
    other_object.add(obj)

objs[0].do_sth()

【讨论】:

  • 如果我想分配通用变量名怎么办?像“obj_%s”%s
  • 然后使用字典而不是列表。你的数据有一些结构(例如,你有与值相关的键,或者只是一个值列表等),你选择的 Python 数据结构应该反映这一点。
【解决方案2】:

你可以使用列表来定义它。

objs = list()
for i in range(10):
    objs.append(MyClass())

【讨论】:

  • 类数不知道怎么办?
  • 既然你要创建一个对象列表,你必须知道你的列表必须有多少个对象,我猜你总是可以用一个变量替换这个数字。
  • 如果您基于条件创建对象,则可以使用 while 循环,如果条件为真,则将对象附加到列表中。
【解决方案3】:

我希望这就是你要找的。​​p>

class Try:
    def do_somthing(self):
        print 'Hello'

if __name__ == '__main__':
    obj_list = []
    for obj in range(10):
        obj = Try()
        obj_list.append(obj)

    obj_list[0].do_somthing()

输出:

Hello

【讨论】:

  • 但我无法以这种方式访问​​循环外的对象
  • 是的,我明白你的意思。我已经更新了我的示例,请参阅。在这里,我已将对象附加到列表中,然后您可以在循环之外使用任何对象。抱歉,我的解决方案与其他解决方案没有什么不同。
【解决方案4】:

如前所述创建字典,但在这种情况下,每个键都有您要创建的对象名称。然后将该值设置为您要实例化的类,例如:

class MyClass:
   def __init__(self, name):
       self.name = name
       self.checkme = 'awesome {}'.format(self.name)
...

instanceNames = ['red', 'green', 'blue']

# Here you use the dictionary
holder = {name: MyClass(name=name) for name in instanceNames}

然后你只需调用持有者密钥,你就可以使用你的类的所有属性和方法。

holder['red'].checkme

输出:

'awesome red'

【讨论】:

    【解决方案5】:

    对没有名单的唯一名称使用字典:

    class MyClass:
        def __init__(self, name):
            self.name = name
            self.pretty_print_name()
    
        def pretty_print_name(self):
        print("This object's name is {}.".format(self.name))
    
    my_objects = {}
    for i in range(1,11):
        name = 'obj_{}'.format(i)
        my_objects[name] = my_objects.get(name, MyClass(name = name))
    

    输出:

    "This object's name is obj_1."
    "This object's name is obj_2."
    "This object's name is obj_3."
    "This object's name is obj_4."
    "This object's name is obj_5."
    "This object's name is obj_6."
    "This object's name is obj_7."
    "This object's name is obj_8."
    "This object's name is obj_9."
    "This object's name is obj_10."
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      相关资源
      最近更新 更多