2012-04-12 2 views
2

Я довольно новичок в Python, и у меня есть вопрос о аккуратном способе создания нескольких объектов с различными свойствами. На данный момент я имею специально создать каждый так: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, и т.д. и т.п.

Возможно ли это?

+2

Вы пробовали использовать словари вместо? – jamylak

+2

Вы должны [сохранить данные (включая индексы) из ваших имен переменных] (http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). –

+0

@vartec Нет, я давно прошел этап домашней работы ... просто новый для программирования! – FakeDIY

ответ

7

Если у вас есть объекты с именами object_1, object_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) 
+0

Спасибо. Это кажется действительно очевидным, когда вы это видите! :-) – FakeDIY

2

Используйте распаковку кортежа вместе со списком.

object_1, object_2, ... = [MyClass(property=foo, property2=x) for x in (bar, 
    bar2, ...)] 
+0

Спасибо. В этом есть смысл. Как вы тогда делаете object_1.DoStuff, object_2.DoStuff и т. Д.? – FakeDIY

+1

Конечно. Но если вы сделаете это для каждого отдельного объекта, тогда вы должны [поместить их в список, как говорит Свен] (http://stackoverflow.com/a/10126809/20862). –

3

Другим способом обойти это может быть использование более значимых определений объектов с помощью словаря. Решение Sven Marnach работает хорошо, если все, о чем вы заботитесь, это object_1, object_2 и т. Д., Но что, если ваши объекты действительно имеют индивидуальную важность позже? Ссылка на них станет неинтуитивной, и вы быстро заблудитесь. Вот некоторые примеры кода, чтобы помочь вам в этом отношении:

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) 
+0

Это выглядит полезным, спасибо :-) – FakeDIY

Смежные вопросы