Python中,循环依赖,和单身(Python, Circular Dependencies, an

2019-10-17 18:28发布

我已经挖自己变成一个相当孔在这里。

我工作中的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

抱歉,系统这导致一些讨厌的循环依赖。

主要有创建引擎,并了解它,它运行的发动机进口,运行该系统的进口。 问题:系统进口然后导入引擎,循环引用。

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()

这将停止进口情况的发生,直到该线,这是很好的,但它看起来错误,eveyrthing感觉就像我做的事情是错误的。

我很想只是传递引擎为每一个系统构造参考,但多数民众赞成有点重构的,我想知道是否有解决这种单/循环引用问题,对未来的更体面的方式。

Answer 1:

如何具有“登记”机制,其中,每个system模块“注册”本身与Engine使用一些模块级代码类:

engine.py

class Engine():
    @classmethod
    def register(cls, type):
        ...

system1.py

from engine import Engine

class System1():
    ...

Engine.register(System1)

这样一来, Engine不直接要知道什么被插入到它。



文章来源: Python, Circular Dependencies, and Singletons