Python,循环依赖关系和单身人士

时间:2013-03-05 05:22:56

标签: python import singleton circular-dependency kivy

我在这里挖了一个洞。

我正在使用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作为对每个系统构造函数的引用传递,但这有点重构,我想知道是否有更好的方法来修复这种单例/循环引用问题未来。

1 个答案:

答案 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并不直接知道插入的内容。