2013-08-05 47 views
1
# ----- object1.py ----- 
from object2 import object2 

class object1: 
    brother = object2() 

 Python的圓形進口

# ----- object2.py ----- 
from object1 import object1 

class object2: 
    sister = object1() 

這應該是可行的。不是。處理這個問題的適當方法是什麼?

+0

思想實驗:如果你熬的問題降到純粹面向對象的類比,你能描述哪種類型的關係模仿這種行爲?然而 - 如果你真的把它煮沸了 - 兄弟姐妹們不會自發地生氣。通常有一位父母參與。看看我要去哪裏?另一種可能的解決方案是觀察者模式,其中對象宣佈自己,找到現有的兄弟姐妹並註冊來自其他新同胞的公告。 – synthesizerpatel

+0

讓它成爲父母和孩子然後:)這個想法是反向引用,應該是可行的。 –

回答

1

'from object2 import object2'是一個可執行語句,在這一行上,object2模塊被加載到sys.modules中。而且,由於在object2模塊中嘗試了相同的操作,並且因爲object2類尚未定義,所以它無法工作。

//-->object2.py 
from object1 import object1 
class object2: 
    pass 

//-->object1.py 
from object2 import object2 
class object1: 
    pass 

所以,即使上面的代碼也不行。現在

,如果您修改代碼以

//-->object2.py 
import object1 
class object2: 
    brother = object1.object1() 

//-->object1.py 
import object2 
class object1: 
    sister = object2.object2() 

如果通過執行的順序拿到如果我們運行object2.py

import object1 -->object2.py 
    import object2 -->object1.py 
    class object1: 
     sister = object2.object2() //->it will give error here, as object2 module doesn't have object2 defined yet 
0

這裏的問題比通常的循環導入問題困難。要執行定義object1的類語句,您需要定義object2,但要執行定義object2的類語句,則需要定義object1。您可以解決此問題:

object1.py

class object1(object): 
    pass 

import object2 

object1.brother = object2.object2() 

object2.py

class object2(object): 
    pass 

import object1 

object2.sister = object1.object1() 

這定義足夠的object1object2導入模塊之前初始化其他類。不過,我強烈建議不要這樣做。循環依賴是一件令人頭痛的事情,無論你使用什麼語言,當它們依賴這種初始化順序時,它們只會變得更糟。

docs對處理循環進口有更多的建議。