2013-03-05 5 views
1

나는 여기 자신을 파고 들었다.파이썬, 순환 의존성 및 싱글 톤

저는 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 
from code import engine 

class System1(): 
    def SomeMethod(self): 
     engine.GetInstance().mSystem2.DoThings() 

system1.py 당신은 그림을 얻는다. 내가 사방이 끔찍한 코드로 지금이 우회 :

system1.py이 괜찮 그 라인까지 발생하지 가져 오기를 중지

#system1.py 

class System1(): 
    def SomeMethod(self): 
     from code import engine 
     engine.GetInstance().mSystem2.DoThings() 

하지만 잘못 보이는, eveyrthing 느낌 내가 잘못한 것처럼.

나는 엔진을 모든 시스템 생성자에 대한 참조로 전달하려고하지만 약간의 리팩토링을 가졌으므로 이런 종류의 싱글 톤/순환 참조 문제를 수정하는 데 더 알맞은 방법이 있는지 알고 싶습니다. 미래를위한

답변

2

방법은 "등록"기구를 갖는 약 여기서 일부 모듈 레벨 코드 사용 Engine 클래스 각각 system 모듈 "등록"자체 :

engine.py

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

시스템 1을 .py

from engine import Engine 

class System1(): 
    ... 

Engine.register(System1) 

그런 식으로 Engine은 무엇이 그것에 꽂혀 있는지 직접 알 필요가 없습니다.

+0

이것은 흥미로운 아이디어입니다. 이 동적 언어에 대한 몇 가지 사항은 저에게 맞지 않지만 때로는 엄격한 유형이 아니라는 것이 매우 유용한 도구입니다. 나는 총을 줘, 고마워! – MintyAnt