首先出現(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.py
class Model(object):
def do_something(self):
module2.print_model(self)
#module2.py
import module1
def print_model(model):
print repr(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