Как инициировать объекты из разных классов в цикле?

#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)