У меня есть основной сценарий со статическим классом, который импортирует другие сценарии и сохраняет их в формате dict в указанном классе.Цель этого класса - действовать как интерфейс между скриптами, позволяя им использовать класс для добавления функциональности в программу.В этом классе, в зависимости от некоторых событий, он вызывает некоторые функции в хранимых сценариях, но в этих сценариях они используют некоторые другие функции / переменные в классе из основного сценария.Я думал, что, будучи статическим классом, он будет делиться значениями своих атрибутов через все сценарии, но это не так.Попытка получить то есть Interface.scripts.get('foo').a_function()
вызовет AttributeError, потому что в скриптах dict нет 'foo'.
Я уже выполнил свою задачу, не имея статических атрибутов и статических методов в классе и передавая единственный экземплярэто для скриптов функционирует как аргумент, , но (вот почему я это делаю), я хотел бы упростить код для меня и для всех, кто хочет писать скрипты, и просто с помощью простого from mainscript import Interface
чтобы я мог использовать все классы интерфейса без проблем.
Вот резюме кода:
mainscript.py
import os
import importlib
class Interface:
scripts = {}
@staticmethod
def init():
"""This function gets called when mainscript is run in terminal:
python mainscript.py
"""
for file in os.listdir("./scripts/"):
if file.endswith(".py"):
Interface.scripts[file[:-3]] = importlib.import_module(file)
@staticmethod
def some_event():
Interface.scripts.get('bar').do_stuff()
@staticmethod
def print_stuff(some_arg):
print('hello', some_arg)
...more code...
if __name__ == '__main__':
Interface.init()
Interface.run() # some loop that handles events, so 'some_event' will be called eventually
bar.py
from mainscript import Interface
def do_stuff():
Interface.print_stuff('me')
Interface.scripts.get('foo').a_function() # AttributeError, foo not in scripts
Та же ошибка может произойти в той же ситуации надругие скрипты.Обратите внимание, что проблема здесь заключается в совместном использовании памяти для сохраненных значений в атрибутах класса Interface (скажем, сценарии или любая другая переменная).
Итак, какие обходные пути можно сделать? Возможно ли иметь такой статическийпеременная (думая как в c #) ?, лучше я вернусь к тому, что у меня было раньше, без использования статического класса?
Это мой первый вопрос здесь, поэтому я надеюсь, что смогу объяснить ситуацию.Спасибо