Совместное использование переменных в новых экземплярах объекта - PullRequest
1 голос
/ 01 апреля 2019

Справочная информация: Я пишу модуль для настройки встроенной системы. В этом контексте мне нужно загрузить некоторые модули и выполнить некоторые системные настройки.

Контекст: У меня есть родительский класс, содержащий некоторый общий код (загрузка файла конфигурации, сборка ssh-соединения и т. Д.), Используемый для нескольких дочерних классов. Одним из них является класс модуля, который устанавливает модуль и поэтому использует, помимо прочего, соединение ssh и файл конфигурации. Моя цель - предоставить доступ к файлу конфигурации и подключению к следующему модулю, который будет настроен. Для подключения просто бесполезно создавать и уничтожать его все время, но для файла конфигурации изменяются во время настройки может привести к неопределенному поведению.

Исследования / подходы:

  • Я пытался использовать переменные класса, однако они не передаются при инициализации новый объект модуля.

  • Кроме того, я пытался использовать глобальные переменные, но так как родительский класс и дочерние классы находятся в разных файлах, это не сработает (да, я могу поставить их все в одном файле, но это будет беспорядок) Также с помощью функции получения из файл, в котором я определил глобальную переменную, не работал.

  • Мне известно о «встроенном» решении от Как сделать кросс-модульную переменную? переменная, но чувствую, что это будет немного излишним ...

  • Наконец, я могу сохранить файл конфигурации и соединение в центральном сценарий и передать их каждому экземпляру, но это приведет к загрузке зависимостей, и я не думаю, что это хорошее решение.

Итак, здесь приведен фрагмент кода с примером метода для получения путей к файлам. Код настроен в соответствии с подходом 1 (переменные класса)

Пример файла конфигурации:

Files:
  Core:
    Backend:
      - 'file_1'
      - 'file_2'
Local:
  File_path:
    Backend: '/the/path/to'

Родительский класс в setup_class.py

import os
import abc
import yaml

class setup(object):
    __metaclass__ = abc.ABCMeta
    configuration = []

    def check_for_configuration(self, config_file):
        if not self.configuration:
            with open(config_file, "r") as config:
                self.configuration = yaml.safe_load(config)

    def get_configuration(self):
        return self.configuration

    def _make_file_list(self, path, names):
        full_file_path = []
        for file_name in names:
            temp_path = path + '/' + file_name
            temp_path = temp_path.split('/')
            full_file_path.append(os.path.join(*temp_path))
        return full_file_path

    @abc.abstractmethod
    def install(self):
        raise NotImplementedError

Класс модуля в module_class.py

from setup_class import setup

class module(setup):
    def __init__(self, module_name, config_file = ''):
        self.name = module_name
        self.check_for_configuration(config_file)

    def install(self):
        self._backend()

    def _backend(self):
        files = self._make_file_list(
                    self.configuration['Local']['File_path']['Backend'],
                    self.configuration['Files'][self.name]['Backend'])
        if files:
            print files

И, наконец, тестовый скрипт:

from module_class import module
Analysis = module('Analysis',"./example.yml")
Core = module('Core', "./example.yml")
Core.install()

Теперь при запуске кода файл конфигурации загружается каждый раз, инициируется новый объект модуля. Я хотел бы избежать этого. Есть ли подходы, которые я не рассматривал? Какой самый лучший способ добиться этого?

1 Ответ

0 голосов
/ 01 апреля 2019

Сохраните ваши глобальные значения в глобальном формате и обратитесь к нему внутри вашего модуля.

cache = {}

class Cache(object):
    def __init__(self):
        global cache
        self.cache = cache
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...