2016-11-10 90 views
0

我有兩個python類,我們稱它們爲A和B. A負責處理通過網絡接收和發送特定格式的消息。 B負責解釋消息。兩個python類實例互相引用

現在a和b分別是A和B類的實例。考慮以下情形:

  • 一個接收消息,並呼籲消息解釋B的一些方法
  • B中的進程的消息,並希望使用的一些方法來發送一個響應

要實現這個我構建了兩個相互參照的類。這工作正常,但我想問你,如果這是一個設計缺陷,應該避免?

爲了說明請參見下面的最少的代碼示例:

class A: 

    def set_b(self, b): 
     self.b = b 


class B: 

    def set_a(self, a): 
     self.a = a 


if __name__ == '__main__': 

    a = A() 
    b = B() 

    b.set_a(a) 
    a.set_b(b) 
+1

很難說,這聽起來不像是一個單獨的班級B給我帶來很多價值 – Sayse

+0

我同意@Sayse,這不是天生的錯誤,但我可能會重新思考你正在嘗試做什麼。將B作爲A的子類可能更有利(假設其他地方沒有使用它)。 – BrandonM

+0

那麼,當我開始研究這個項目時,B並沒有給出答案。我寫了幾個模塊,A(即消息處理)總是保持不變,而B必須單獨實現。這是有兩個班的最初原因。 – Chris

回答

2

CPython中添加循環垃圾收集一些版本前,因爲循環依賴是很常見是一個問題。儘管如此,您可能無法通過調用b方法的a的方法通過self而不是取決於已經參照ab來創建循環。

如果你堅持這個循環,我會盡可能地使鏈接自動化。例如:

class B: 
    def __init__(self, a): 
     self.a = a 
     a.set_b(self) 

a = A() 
b = B(a) 
# Both instances are fully initialized and ready to go. 

如果您忘記傳遞aB,你會得到一個即時異常。