Python循环导入

时间:2013-08-05 19:55:09

标签: python import circular-dependency

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

class object1:
    brother = object2()

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

class object2:
    sister = object1()

这应该是可行的。不是。处理这个问题的合适方法是什么?

2 个答案:

答案 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 

答案 1 :(得分: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在处理循环进口方面有更多建议。