业务模块B 业务公用模块BCommon(比如说推荐系统,可以推荐B,C...等等,所以要用到B中的Model) 在业务模块B中,业务处理需要用到B…
作者:灵剑
链接:https://www.zhihu.com/question/19887316/answer/119484887
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先出现这种问题是因为没有规划好层级,哪些模块和哪些模块逻辑上应该在一起,哪些模块是公共的依赖项,哪些是实际的业务代码,按你的需求,显然B.Model应该是一个独立的模块才对,把第一和第三层合成一个模块然后把第二层独立出去就会出现你这种情况。循环引用是小问题,代码以后难维护、理不清实现的逻辑才是大问题。
其次,Python根本就是可以循环引用的,只要你循环引用中的模块并不是在定义阶段就马上使用,比如:
#module1.pyimportmodule2classModel(object):defdo_something(self):module2.print_model(self)#module2.pyimportmodule1defprint_model(model):printrepr(module1.Model())
两个import其中的一个在导入时会为空,取决于import顺序,但由于只有在函数内部使用,只要import阶段没有执行到相应的位置就不会有问题。也就是说出现这种情况时只要避免三种使用方法:
from ... import ... (这个去掉肯定没啥问题)
直接执行的代码(本来大部分情况下你都应该避免的)
类的继承(基类的模块去import派生类的模块本来就很奇怪啊)
将import放到函数里面,放到最下面,都可以解决问题,但治标不治本,治本的还是要重新划分模块,逻辑理顺了就不会出现循环import
网友评论