#python
#python
Вопрос:
Я пытаюсь инициировать объекты из разных классов, и аргументы находятся в списке. Тип класса должен быть задан аргументами в списке, и я хочу избежать условных утверждений, что он может быть масштабируемым для большего количества классов. Инициированный объект будет добавлен в список объектов.
например:
example_list = [['x', 20], ['p', 50], ['d', 100]
obj_list = []
for i in example_list:
if i[0] == 'x':
xylophone = Xylophone('x', 20)
obj_list.append(xylophone)
if i[0] == 'p':
piano = Piano('p', 50)
obj_list.append(piano)
if i[0] == 'd':
drum = Drum('d', 100)
obj_list.append(drum)
Комментарии:
1. Укажите направление: попробуйте использовать словарь в качестве варианта переключения.
2. Вы должны использовать словарь
3. Если все классы имеют одинаковый интерфейс, как это выглядит, у вас может быть буква сопоставления словаря с классом:
instruments = {"x": Xylophone, ...}
затем создайте их в виде списка понимания:obj_list = [instruments[letter](letter, number) for letter, number in example_list]
. Однако кажется странным, что буква используется как для определения того, какой класс следует создать , так и передается в качестве аргумента.4. @jonrsharpe Да … или, может быть, что-то вроде:
[instruments[letter](letter, *args) for letter, *args in example_list]
… (тогда довольно просто отброситьletter
аргумент, если это действительно не требуется …)
Ответ №1:
Поскольку классы являются объектами в Python, вы могли бы сделать
classes = dict(
x=Xylophone,
p=Piano,...)
for class_name, arg in my_list:
cls = classes[class_name]
object = cls(class_name, arg)