Преобразование списка строк в объекты

У меня есть список строк, скажем что-то вроде:

listofstuff = ['string1', 'string2', 'string3', ...]

У меня есть созданный объект пользовательского класса для того, что я хочу сделать. Все, что я хочу сейчас, это создать кучу указанных объектов, которые названы строками в моем списке. Как я могу это сделать?

Итак, у меня есть что-то вроде:

for object in listofstuff:
     object = classthing(inputs)

Но это не работает. Как мне это сделать?

РЕДАКТИРОВАТЬ: Может быть, я должен уточнить. У меня есть входной файл, который может меняться, и в указанном входном файле есть список имен. Я хочу создать кучу объектов класса, которые все называются именами в списке.

Итак, кто-то дает мне список типа stuff = ['car1', 'car2', 'car3'] и теперь я хочу создать кучу новых объектов Car, каждый из которых будет называться car1, car2 и т. д. Чтобы позже я мог сделать такие вещи, как car1.calculate_price() или что-то еще.

РЕДАКТИРОВАТЬ 2: Извините за все правки, но я также хотел кое-чем поделиться. В том, что я пытаюсь сделать, объекты группируются определенным образом, но способами, которые не очевидны для пользователя. Таким образом, это будет выглядеть как «car1_car23_car4». Так что я хотел, если бы я спросил пользователя, какую машину вы хотите выбрать? И они выбрали car4, это создало бы объект с именем car1_car23_car4, вместо car4.


person Captain_Panda    schedule 29.12.2014    source источник
comment
Чего ты хочешь? Хотите переопределить каждый элемент в этом списке?   -  person GLHF    schedule 29.12.2014
comment
Можете ли вы опубликовать метод __init__ для объектов?   -  person Reut Sharabani    schedule 29.12.2014


Ответы (2)


Динамическое создание имен — неправильный подход. Их очень легко потерять, сделать больше или меньше, чем нужно, или случайно перезаписать существующее имя.

Лучшим подходом было бы создать словарь, в котором ключи — это ваши строки из listofstrings, а значения — экземпляры вашего класса. Вы можете использовать понимание слова и написать что-то вроде:

dct = {name: classthing(inputs) for name in listofstuff}

Ниже представлена ​​демонстрация1 того, что это делает:

>>> class classthing: # This represents your class
...     def __init__(self, name):
...         self.name = name
...
>>> listofstuff = ['Joe', 'Bob', 'Mary']
>>>
>>> dct = {name: classthing(name) for name in listofstuff}
>>> dct  # dct now holds all the data you need
{'Mary': <__main__.classthing object at 0x0205A6D0>, 'Joe': <__main__.classthing object at 0x0205A690>, 'Bob': <__main__.classthing object at 0x0205A6B0>}
>>>
>>> # Each value in dct is an individual instance of your class
>>> dct['Joe'].name
'Joe'
>>> dct['Bob'].name
'Bob'
>>> dct['Mary'].name
'Mary'
>>>

1Для демонстрации я заменил inputs на name. Однако вам не обязательно делать это в реальном коде.

person Community    schedule 29.12.2014
comment
Я думаю, что это, вероятно, правильный подход, но я не создаю списки имен динамически или каким-то образом, который я могу как-то забыть. У меня есть входной файл со списком имен, и я хочу преобразовать имена в этом списке в объекты, которые называются указанными именами. Есть ли способ сделать это? - person Captain_Panda; 29.12.2014
comment
Это динамическое создание имен. И вы можете сделать это, обновив globals() как globals()[object] = classthing(inputs), но это не очень элегантно и подвержено ошибкам. - person ; 29.12.2014
comment
Извините, я немного уточнил в верхнем вопросе. Я знаю, что это не так элегантно, извините, я новичок и меня бросают в это для работы. Ваш способ также кажется, что я могу делать то, что мне нужно, но причины, о которых я спрашиваю, указаны выше. Спасибо за вашу помощь! - person Captain_Panda; 29.12.2014

Предполагая, что ваши строки находятся в списке с именем listofstrings, это создает соответствующий список, строящий объекты из строк (также предполагая, что метод __init__ для класса ожидает один строковый аргумент):

listofobjects = [classthing(s) for s in listofstrings]

Если это то, что вы ищете, читайте дальше об понимании списков.

Хотя это отвечает на ваш вопрос, другой ответ, вероятно, является лучшим способом сделать это.

person Reut Sharabani    schedule 29.12.2014