Python 仅导入包的一部分以避免循环导入
我遇到了循环导入问题,因为我只需要导入包的一部分。当我的程序启动时,我创建了一个驱动程序类,它继承了包中定义的类,但该包的另一个无关部分导入了驱动程序;我需要停止运行包中不相关的部分,直到以后需要它 更多信息:我的程序中有一个接口包。它们只是父对象,其方法和属性与程序中的许多对象相同。它们除了有相似的用途外,没有任何逻辑联系。它们装在一个包裹里完全是为了我的方便;我不希望在顶层有大量的.py文件,而是将它们排序到子文件夹中 软件包如下所示:Python 仅导入包的一部分以避免循环导入,python,import,package,circular-dependency,Python,Import,Package,Circular Dependency,我遇到了循环导入问题,因为我只需要导入包的一部分。当我的程序启动时,我创建了一个驱动程序类,它继承了包中定义的类,但该包的另一个无关部分导入了驱动程序;我需要停止运行包中不相关的部分,直到以后需要它 更多信息:我的程序中有一个接口包。它们只是父对象,其方法和属性与程序中的许多对象相同。它们除了有相似的用途外,没有任何逻辑联系。它们装在一个包裹里完全是为了我的方便;我不希望在顶层有大量的.py文件,而是将它们排序到子文件夹中 软件包如下所示: 接口 __初始值 destroyinterface.p
接口
__初始值
destroyinterface.py
图形接口.py
而_u__; init __u; py看起来像这样:
从destroyinterface导入destroyinterface
从图形接口导入图形接口
我想在不初始化graphicsinterface.py的情况下导入DestroyInterface。graphicsinterface.py导入依赖于DestroyInterface的驱动程序,但是如果不初始化graphicsinterface.py,我似乎无法访问DestroyInterface来创建驱动程序
我不想将GraphicsInterface导入从_uuu _uu.py中删除,因为我不希望在导入时必须知道它位于名为GraphicsInterface.py的文件中。在每次导入中包含关于我的包的结构的信息,既增加了样板文件,又使重构更加困难。我希望可以直接从interfaces模块访问这些类以进行导入,但只有在我显式访问它们时,才能初始化它们的.py文件
我也不想在graphicsinterface.py中使用延迟导入驱动程序,因为它很混乱(我只希望在实际需要时初始化文件),而且graphicsinterface的时间敏感方法中的导入会减慢它们的速度
我运气不好吗?我需要以不同的方式对文件进行排序吗?我建议在图形界面中查看两种解决方案。首先,如果只有两个函数需要驱动程序,请在这些函数中导入驱动程序。导入一个已经导入的模块是有效的,所以在驱动程序中导入它应该很好。 另一种方法是在图形界面中执行以下操作:
driver = None # filled in when driver is imported
然后在别处
import driver
import interfaces.graphics
interfaces.graphics.driver = driver
所以我遇到了一个黑客来解决我的问题。我想我会和你分享的 我的____; init __; py现在看起来像这样:
类疯狂背包(对象):
@财产
def接口(自):
导入crazyhackthing.destroyinterface
返回destroyinterface.destroyinterface
@财产
def图形界面(自):
导入crazyhackthing.graphicinterface
返回graphicinterface.graphicinterface
导入系统
sys.modules[“crazyhackthing”]=sys.modules[“interfaces”]
sys.modules[“interfaces”]=CrazyHack()
这会使此包中的任何导入语句引用其中定义的对象的属性,从而将文件的初始化延迟到显式导入。不知道这在Python3上是否有效,首先这可能是一个糟糕的想法,但它对我有效。愿上帝怜悯我的灵魂