0

我遇到了如下所示的一些情況,其中每個類都需要另一個類,並且它創建了循環依賴關係。我遇到這種類型的情況,而使用ctypes包裝一些c代碼。 已經有很多這個主題的帖子,但我沒有發現他們有幫助,我需要一些例子。任何關於解決這個問題的想法/例子都會有所幫助。如何在Python中解決這種循環依賴關係

# Module A 
from B import C2 

class C1(object): 
    def __init__(self): 
     self.name = "C1" 
     self.c2 = C2() 


# Module B 
from A import C1 

class C2(object): 
    def __init__(self): 
     self.name = "C2" 
     self.c1 = C1() 

# Main 
from A import C1 

if __name__ == "__main__": 
    o = C1() 
    print o.name 
+1

該代碼包含一個無限的遞歸:該'__init __()'C1'的'方法無條件調用'__init __() ''C2',反之亦然。 –

+0

[在python中解決循環導入錯誤]的可能的重複(http://stackoverflow.com/questions/10027011/resolve-circular-import-error-in-python)。我的例子與我在那裏的回答基本相同。 –

回答

2

更改模塊B不導入C1類,直到最後一刻,裏面的__init__.py

class C2(object): 
    def __init__(self): 
     from A import C1 
     self.name = "C2" 
     self.c1 = C1() 

注意,因爲C1實例C2,反之亦然,你會與結束無限遞歸問題,但我會慈善地假設你沒有這個問題以外的例子。

4

解決方案(假設inifinite遞歸解析):

  1. 避免這種循環依賴的。

  2. 將相互依存的組件放入同一個模塊中。

  3. 使用import Aimport B而不是from ...的形式。 (如果涉及軟件包,在某些情況下可能會失敗。)

  4. 使用功能級別導入。

1

這是一個在任何語言中的圓形扶養,實際上它是一個無限遞歸

採取C2出來的C1和C1出C2

from B import C2 
from A import C1 

class C3(object): 
    def __init__(self):   
    self.c1 = C1() 
    self.c2 = C2() 
0

我覺得這個代碼將幫助你。

由於這是一個循環導入錯誤,請從MODULE B - >「從導入C1中刪除」導入語句。

在需要的地方輸入'C1'(在方法內部)。

這樣的 -

類C2(對象):

def __init__(self): 
    import A.C1 
    self.name = "C2" 
    self.c1 = C1()