gpt4 book ai didi

Python、循环依赖和单例

转载 作者:行者123 更新时间:2023-12-01 05:48:37 24 4
gpt4 key购买 nike

我已经给自己挖了一个大坑了。

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

引擎.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 必须创建引擎,并了解它,它运行引擎导入,它运行系统导入。问题:系统导入然后导入引擎,循环引用。

系统1.py

#system1.py
from code import engine

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

你明白了。我现在绕过了这个,到处都是可怕的代码:

系统1.py

#system1.py

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

这会阻止导入发生,直到该行,这很好,但看起来不对,一切都感觉我做错了。

我很想将 Engine 作为对每个系统构造函数的引用传递,但这需要一些重构,我想知道是否有更合适的方法来解决这种单例/循环引用问题 future 。

最佳答案

拥有一个“注册”机制怎么样,其中每个系统模块使用一些模块级代码向Engine类“注册”自己:

engine.py

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

system1.py

from engine import Engine

class System1():
...

Engine.register(System1)

这样,Engine 就不必直接知道插入的是什么。

关于Python、循环依赖和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15216424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com