5

我对 Python 还很陌生,我有一个关于创建具有不同属性的多个对象的巧妙方法的问题。目前,我必须像这样专门创建每个:

object1 = MyClass(property=foo,property2=bar)
object1.DoStuff(variable = foobar)

object2 = MyClass(property=foo,property2=bar2)
object2.DoStuff(variable = foobar)

object3 = MyClass(property=foo,property2=bar3)
object3.DoStuff(variable = foobar)

我的问题是我想以这种方式创建数十个对象,并且必须像这样手动创建每个对象似乎是非常糟糕的编程。有没有更好的方法来创建属性略有不同的多个对象?

我想我想做的是:

list = [prop1, prop2, prop3, prop4, prop5]
while i < len(list)
    object_i = MyClass(property=foo,property2=list[i])
    object_i.DoStuff(variable = foobar)
    i+=1

并让它创建 5 个名为 object_1、object_2 等的对象

这可能吗?

4

3 回答 3

12

如果您有具有名称等的对象object_1object_2并且想要对所有这些对象执行通用操作,这清楚地表明您实际上应该使用列表objects,并使用循环来执行通用操作。

props = <some list here>
objects = [MyClass(property=foo, property2=prop) for prop in props]
for obj in objects:
    obj.do_stuff(variable=foobar)
于 2012-04-12T15:29:53.557 回答
6

另一种解决方法是在字典的帮助下使用更有意义的对象定义。如果您只关心 object_1、object_2 等,Sven Marnach 的解决方案效果很好,但如果您的对象稍后实际上具有单独的重要性怎么办?引用它们会变得不直观,你会很快迷路。以下是一些示例代码,可在这方面为您提供帮助:

objectNames = ("foo", "bar", "cat", "mouse")
objectDictionary = {}
for name in objectNames:
    objectDictionary[name] = MyClass(property=foo,property2=bar)

for obj in objectDictionary.itervalues():
    obj.DoStuff(variable = foobar)

如果您希望特定实例执行与其他实例不同的操作,此解决方案使这变得简单:

objectDictionary["bar"].DoSomethingElse(variable = cat)
于 2012-04-12T15:45:20.497 回答
2

使用元组解包和列表推导。

object_1, object_2, ... = [MyClass(property=foo, property2=x) for x in (bar,
  bar2, ...)]
于 2012-04-12T15:27:14.790 回答