我有一个带有静态类的主脚本,该脚本导入其他脚本并将它们存储在所述类的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#中那样)?我最好不使用静态类就回到以前的样子吗?
这是我在这里的第一个问题,所以希望我能解释一下情况。谢谢
答案 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