Создание системы из класса внутри функции и используемой в основной части

1

Я не знаю, какой путь лучше для достижения моей цели, поэтому любое предложение приветствуется.

У меня есть скрипт 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), поэтому никто не очень удобен. Любая другая возможность?

Спасибо :)

Теги:
class

2 ответа

1
Лучший ответ

Кажется, что вам нужно создать новый класс 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
  • 0
    Действительно, это третья возможность, которая может быть более удобной.
  • 0
    Для простоты, это решение, которое я принял. Некоторое небольшое изменение, я отложил вычислительную функцию, чтобы использовать многопроцессорность. Не слишком уродливо, и это работает :)
2

Я предполагаю, что у вас есть два сценария под названием 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.

Вы также можете передать начальные параметры в цикл, если хотите.

  • 0
    Спасибо за предложение, так что я действительно должен разбить свой сценарий на 2 файла. Когда я это сделаю, я попробую этот метод, который выглядит очень чистым и компактным. Где __all__ атрибут __all__ ? начало файла? в системном классе?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню