業(yè)務(wù)模塊B 業(yè)務(wù)公用模塊BCommon(比如說推薦系統(tǒng)统倒,可以推薦B,C...等等寨典,所以要用到B中的Model) 在業(yè)務(wù)模塊B中,業(yè)務(wù)處理需要用到B…
作者:靈劍
鏈接:https://www.zhihu.com/question/19887316/answer/119484887
來源:知乎
著作權(quán)歸作者所有房匆。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)耸成,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
首先出現(xiàn)這種問題是因?yàn)闆]有規(guī)劃好層級(jí)浴鸿,哪些模塊和哪些模塊邏輯上應(yīng)該在一起井氢,哪些模塊是公共的依賴項(xiàng),哪些是實(shí)際的業(yè)務(wù)代碼岳链,按你的需求花竞,顯然B.Model應(yīng)該是一個(gè)獨(dú)立的模塊才對(duì),把第一和第三層合成一個(gè)模塊然后把第二層獨(dú)立出去就會(huì)出現(xiàn)你這種情況掸哑。循環(huán)引用是小問題约急,代碼以后難維護(hù)、理不清實(shí)現(xiàn)的邏輯才是大問題苗分。
其次厌蔽,Python根本就是可以循環(huán)引用的,只要你循環(huán)引用中的模塊并不是在定義階段就馬上使用摔癣,比如:
#module1.pyimportmodule2classModel(object):defdo_something(self):module2.print_model(self)#module2.pyimportmodule1defprint_model(model):printrepr(module1.Model())
兩個(gè)import其中的一個(gè)在導(dǎo)入時(shí)會(huì)為空奴饮,取決于import順序,但由于只有在函數(shù)內(nèi)部使用择浊,只要import階段沒有執(zhí)行到相應(yīng)的位置就不會(huì)有問題戴卜。也就是說出現(xiàn)這種情況時(shí)只要避免三種使用方法:
from ... import ... (這個(gè)去掉肯定沒啥問題)
直接執(zhí)行的代碼(本來大部分情況下你都應(yīng)該避免的)
類的繼承(基類的模塊去import派生類的模塊本來就很奇怪啊)
將import放到函數(shù)里面琢岩,放到最下面叉瘩,都可以解決問題,但治標(biāo)不治本粘捎,治本的還是要重新劃分模塊,邏輯理順了就不會(huì)出現(xiàn)循環(huán)import