簡體   English   中英

如何在Python中解決這種循環依賴

[英]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

解決方案(假設無限遞歸得到解決):

  1. 避免這種循環依賴。

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

  3. 使用import Aimport B代替from ...表單。 (如果涉及軟件包,則在某些情況下可能會失敗。)

  4. 使用功能級導入。

更改模塊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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM