2013-03-05 48 views
1

我在這裏挖了一個洞。Python,圓形依賴關係和單身人士

我正在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 

Unfortunatley發動機,這導致一些討厭循環依賴。

主要有創建引擎,並瞭解它,它運行引擎進口,它運行系統導入。 問題:系統導入然後導入引擎,循環引用。

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感覺就像我做錯事一樣。我試圖通過引擎作爲每個系統構造函數的引用,但是這有點重構,我想知道是否有更體面的方式來解決這種單例/循環引用問題爲將來。

回答

2

如何具有 「登記」 機制,其中,每個模塊system 「寄存器」 本身與Engine類使用一些模塊級代碼:

engine.py

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

系統1 .py

from engine import Engine 

class System1(): 
    ... 

Engine.register(System1) 

這樣,Engine不需要直接知道插入的內容。

+0

這是一個有趣的想法。有些關於這些動態語言的東西很難與我一起工作,但有時,沒有嚴格的類型是非常方便的工具。我會給這個鏡頭,謝謝! – MintyAnt 2013-03-05 05:40:14