从脚本之间的共享静态类中获取值

时间:2019-05-04 08:38:37

标签: python-3.x static

我有一个带有静态类的主脚本,该脚本导入其他脚本并将它们存储在所述类的dict中。该类的目的是充当脚本之间的接口,使它们可以使用该类向程序添加功能。 在此类中,根据某些事件,它会在存储的脚本中调用某些函数,但是在这些脚本中,它们会使用主脚本中的类中的某些其他函数/变量。 我认为这是一个静态类,它将通过所有脚本共享其属性值,但事实并非如此。尝试获取Interface.scripts.get('foo').a_function()即会引发AttributeError,因为脚本字典中没有'foo'。

我已经实现了没有静态属性的目标,也没有在类中使用静态方法,并且仅将其实例传递给脚本作为参数,但是(这就是我这样做的原因)我想为我自己和所有想编写脚本的人简化代码,只需使用简单的from mainscript import Interface就可以使我毫无问题地使用所有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

在其他脚本上出现相同情况时也会发生相同的错误。 注意,这里的问题是共享接口类的属性(例如脚本或任何其他变量)中存储的值的内存。

那么,我能做些什么解决方法?有可能具有这样的静态变量(就像在c#中那样)?我最好不使用静态类就回到以前的样子吗?

这是我在这里的第一个问题,所以希望我能解释一下情况。谢谢

2 个答案:

答案 0 :(得分:0)

请注意,在脚本字典中另存为键的内容包括.py扩展名,只需将其删除即可。

Interface.scripts[file[:-3]] = importlib.import_module(file)

答案 1 :(得分:0)

我只是向所有想知道的人解决了这个问题:

我将接口类移至另一个脚本interface.py 然后从mainscript.py导入接口类,如下所示:

mainscript.py

from interface import Interface

if __name__ == "__main__":
    Interface.init()
    Interface.run()

bar.py和其他脚本中,所有内容保持不变。

这样,我保证接口模块仅在主脚本中导入一次,因此bar.py之类的脚本可以在不重置Interface的类变量(或任何发生的情况)的情况下导入Interface