2014-07-23 99 views
1

我已經習慣了Python的打包機制,並努力瞭解如何避免循環導入。似乎很難開發一個基於類的模型,並在類之間建立關係,而不會受到循環依賴問題的影響。兩種關係的最佳實踐

我感興趣的地方有很多類和關係的情況下,但煮下來到一個簡單的表格:

如果我有兩個類A和B與它們之間的許多一對多的關係,方法A.getRelatedBs()和B.getRelatedAs(),將代碼打包到模塊和包中的最佳方式是什麼?

把它們放在一個模塊中的解決方案可能適用於這種簡單的情況,但在規模上並不適用,屆時將會有更多的類和關係。

這裏最好的做法是什麼?

+0

避免依賴關係?如果你有這麼多的依賴關係,你不能把它們全部放到一個模塊中,但是你的設計出了問題...... – Bakuriu

+0

如果一個問題空間被相互關聯的N個類最優地覆蓋,那麼所有N個類都需要放在一個模塊中?我不這麼認爲。 – Laizer

+0

是的,只要'N'足夠小(例如2,3,4)。如果N很大,那麼首先編寫類的方式會出現問題,因此您應該重構它們並獲得2組或更多組類,其中每組只有2,3,4個類。 – Bakuriu

回答

1

唯一一次碰到與循環依賴問題相抵觸的是類似的項目,許多小模塊都在一起工作。答案是不要將導入模塊中的任何名稱導入當前模塊名稱空間,而是將完全限定的引用用於其他模塊。

因此,而不是:

from foo import Foo,Foobar 
from bar import Bar,Barbaz 

class Zuul(Foo): 
    def do_something(self): 
     self.bar = Bar() 
     self.baz = Barbaz() 

而是執行此操作:

import foo 
import bar 

class Zuul(foo.Foo): 
    def do_something(self): 
     self.bar = bar.Bar() 
     self.baz = bar.Barbaz() 

的Python試圖通過只輸入每個模塊一旦得到解決圓形進口問題。但是,如果您將來自這些導入模塊的名稱分配給您的模塊,那麼它必須嘗試服從一個訂單,而不能用於循環導入。使用完全限定名似乎避開了這個問題。它更打字,但更安全。