Как создать экземпляр списка классов, используя для цикла?

user2442072 спросил: 13 июня 2018 в 11:18 в: python

Как я могу создавать объекты из списка разных классов, каждый из которых задан в другом модуле? Что-то вроде:

a.py:

class a():
    def __init__():
        print('a called')

b.py:

class b():
    def __init__():
        print('b called')

main.py

import a
import bclasses = ['a', 'b']for class in classes:
    class = class()

3 ответа

Есть решение
Patrick Haugh ответил: 13 июня 2018 в 11:27

Предполагая, что вы знаете все классы при написании программы (т. е. вы не пытаетесь обнаружить их динамически во время выполнения), вы можете поместить создание внутри литерала списка:

from a import a
from b import bobjects = [a(), b()]

Если вы получаете какой-то список классов откуда-то, то это так же просто, как цикл над этим списком и вызов каждого класса.

import a
import bclasses = [a.a, b.b]
objects = [cls() for cls in classes]
AetherUnbound ответил: 13 июня 2018 в 11:26

Нужно ли ссылаться на классы на список строк? Вы можете сделать:

classes = [a.a, b.b]
for cls in classes:
    class_instance = cls()
S. Bender ответил: 15 июня 2018 в 12:34

, если пользователь вводит имена классов, вам необходимо обработать строки, как в вашем первом примере, с определениями классов в списке строк. В этом случае используйте eval(classname), чтобы получить конструктор / init вашего класса.

from a import a
from b import b
classnames = ["a", "b"]
instances = [eval(n)() for n in classnames]

PS: вы забыли себя в своем init -definitions, что вызывает проблемы как таковые ошибки uccurs: __init__()takes 0 positional arguments but 1 was given

Дополнительное видео по вопросу: Как создать экземпляр списка классов, используя для цикла?

17.Python для Начинающих - Классы Часть1

Уроки Python для начинающих | #6 - Циклы For, While, а также операторы

9.Python для Начинающих - Массивы Часть2