我在这里挖了一个洞。
我正在使用PyDev中的Python / Kivy应用程序。
应用程序运行了很多系统(大约10个),因此我将它们推入引擎来处理所有事情。
为方便访问,我通过(最差的)单身人士抓住引擎
main.py
#main.py
from code import engine
class MyApp(App):
def build(self):
engine.GetInstance().Initialize()
if __name__ == '__main__':
MyApp().run()
engine.py
#engine.py
from code import system1
from code import system2
gEngineInstance = None
def GetInstance():
global gEngineInstance
if (gEngineInstance == None):
gEngineInstance = Engine()
return gEngineInstance
class Engine():
mSystem1 = None
mSystem2 = None
def Initialize(self):
self.mSystem1 = system1.System1()
self.mSystem2 = system2.System2()
# Omitted
不幸的是,这导致了一些讨厌的循环依赖。
Main必须创建引擎,并了解它,它运行引擎导入,运行系统导入。 问题:系统导入然后导入引擎,循环引用。
system1.py
#system1.py
from code import engine
class System1():
def SomeMethod(self):
engine.GetInstance().mSystem2.DoThings()
你得到了照片。 我现在用这个可怕的代码绕过了这个:
system1.py
#system1.py
class System1():
def SomeMethod(self):
from code import engine
engine.GetInstance().mSystem2.DoThings()
这会阻止导入发生直到那一行,这很好,但看起来不对,传达感觉就像我做错了。
我很想将Engine作为对每个系统构造函数的引用传递,但这有点重构,我想知道是否有更好的方法来修复这种单例/循环引用问题未来。
答案 0 :(得分:2)
如何使用“注册”机制,其中每个system
模块使用一些模块级代码“注册”自己与Engine
类:
engine.py
class Engine():
@classmethod
def register(cls, type):
...
system1.py
from engine import Engine
class System1():
...
Engine.register(System1)
这样,Engine
并不直接知道插入的内容。