[英]How to resolve this kind of Circular dependency in Python
我遇到了如下所示的情況,其中每個類都需要另一個類,並且它創建了循環依賴關系。 我在使用ctypes包裝一些c代碼時遇到了這種類型的情況。 關於這個主題已經有很多文章了,但是我發現它們沒有幫助,我需要一些例子。 解決此問題的任何想法/示例都會有所幫助。
# 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
解決方案(假設無限遞歸得到解決):
避免這種循環依賴。
將相互依賴的組件放入同一模塊。
使用import A
和import B
代替from ...
表單。 (如果涉及軟件包,則在某些情況下可能會失敗。)
使用功能級導入。
更改模塊B,直到最后一刻才在__init__.py
內部導入類C1
:
class C2(object):
def __init__(self):
from A import C1
self.name = "C2"
self.c1 = C1()
請注意,由於C1
實例化了C2
,反之亦然,因此您將遇到無限遞歸問題,但是我很樂意假設您在示例示例之外沒有任何問題。
在任何語言中,這都是循環依賴,實際上是無限遞歸
從c1中取出c2,從c2中取出c1
from B import C2
from A import C1
class C3(object):
def __init__(self):
self.c1 = C1()
self.c2 = C2()
由於是循環導入錯誤,因此從模塊B->“從A導入C1”中刪除導入語句。
在需要的地方(方法內)導入“ C1”。
像這樣-從B導入C2
C1類(對象):
def __init__(self):
self.name = "C1"
self.c2 = C2()
C2類(對象):
def __init__(self):
import A.C1
self.name = "C2"
self.c1 = C1()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.