# ----- object1.py -----
from object2 import object2
class object1:
brother = object2()
# ----- object2.py -----
from object1 import object1
class object2:
sister = object1()
這應該是可行的。不是。處理這個問題的適當方法是什麼?
# ----- object1.py -----
from object2 import object2
class object1:
brother = object2()
# ----- object2.py -----
from object1 import object1
class object2:
sister = object1()
這應該是可行的。不是。處理這個問題的適當方法是什麼?
'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
這裏的問題比通常的循環導入問題困難。要執行定義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()
這定義足夠的object1
或object2
導入模塊之前初始化其他類。不過,我強烈建議不要這樣做。循環依賴是一件令人頭痛的事情,無論你使用什麼語言,當它們依賴這種初始化順序時,它們只會變得更糟。
docs對處理循環進口有更多的建議。
思想實驗:如果你熬的問題降到純粹面向對象的類比,你能描述哪種類型的關係模仿這種行爲?然而 - 如果你真的把它煮沸了 - 兄弟姐妹們不會自發地生氣。通常有一位父母參與。看看我要去哪裏?另一種可能的解決方案是觀察者模式,其中對象宣佈自己,找到現有的兄弟姐妹並註冊來自其他新同胞的公告。 – synthesizerpatel
讓它成爲父母和孩子然後:)這個想法是反向引用,應該是可行的。 –