Я не знаю, какой путь лучше для достижения моей цели, поэтому любое предложение приветствуется.
У меня есть скрипт python, который состоит из следующего:
Class1
Class2
Class3
Class4
...
+ some functions
Каждый класс фактически имитирует компонент системы (цифровой аналоговый преобразователь, микроконтроллер, последовательный периферийный интерфейс,...). Чтобы создать систему, я делаю это в основной части:
if __name__ == '__main__':
elt1 = Class1(param1)
elt2 = Class1(param2)
elt3 = Class1(param3)
elt1 = Class2(param4)
...
У меня есть много элементов для создания, чтобы создать систему. Каждый из них должен быть переделан для каждого нового симулятора, поэтому, если я хочу предварительно запрограммировать множественное моделирование, он занимает довольно некоторое пространство (в основном, я должен каждый раз копировать 100 строк кода).
Я хотел бы определить функцию: creation of the system
. В настоящее время это выглядит так:
def creation_system(parameters):
elt1 = Class1(param1)
elt2 = Class1(param2)
elt3 = Class1(param3)
elt1 = Class2(param4)
...
Теперь система определяется в локальном пространстве памяти функции, и я хотел бы получить к ней доступ в основной части, чтобы сделать:
if __name__ == '__main__':
for simulation_parameter in parameters:
creation_system(parameters)
compute()
save_result()
2 способа сделать это, о которых я могу думать, это либо вернуть каждый из элементов, созданных в конце функции (в кортеже, я думаю), или определить их как глобальные. У меня создано около 40 переменных (elts), поэтому никто не очень удобен. Любая другая возможность?
Спасибо :)
Кажется, что вам нужно создать новый класс System
содержащий все элементы. Чем вы можете передать параметры конструктору этого класса.
Это пример кода:
class System(object):
def __init__(self, parameters):
self.element0 = Class0 (parameters[0])
self.element1 = Class1 (parameters[1])
self.element2 = Class2 (parameters[2])
def compute():
....
def save_result():
....
if __name__ == '__main__':
parameters = ...
mySystem = System(parameters)
mySystem.compute()
mySystem.save_result()
Кроме того, у вас может быть общий класс с только элементами, общими для всех систем (аналогично приведенному выше), а затем создавать новые классы, которые наследуются от предыдущего и имеют специализированное поведение:
class SpecificSystem(System):
def __init__(self, parameters):
super().__init__(parameters)
# Additional elements specific to this system
self.element3 = Class3 (parameters[3])
def compute():
# Behavior specific to this system
....
# Retain save_result() from superclass
Я предполагаю, что у вас есть два сценария под названием components.py
которые определены в ваших классах компонентов и функциях main.py
который является основным кодом для запуска.
Если вы определяете атрибут __all__
в components.py
который включает имена всех ваших классов компонентов, например:
__all__ = ['Class1', 'Class2', 'Class3', ...(and so on)]
Затем в main.py
вы можете создавать экземпляры всех этих классов с помощью одного цикла for:
import components
if __name__ == "__main__":
comp_dict = {}
for cls_name in components.__all__:
comp_dict[cls_name] = getattr(components, cls_name)()
Все, что мы сделали здесь, это получение всех классов с использованием встроенной функции getattr и создание экземпляра в цикле for.
Вы также можете передать начальные параметры в цикл, если хотите.
__all__
атрибут __all__
? начало файла? в системном классе?