说我有一个看起来像这样的模块:
circlejerking/
├── bar.py
├── foo.py
└── __init__.py
bar.py:
from .foo import Foo
class Bar(Foo):
pass
foo.py:
from .bar import Bar
class Foo(object):
my_bar = Bar()
__init__.py:
from .foo import Foo
from .bar import Bar
__all__ = [
'Foo',
'Bar'
]
由于循环导入,使用该模块失败。
In [1]: from circlejerking import Foo
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-2258014c7099> in <module>()
----> 1 from circlejerking import Foo
/home/me/circlejerking/__init__.py in <module>()
----> 1 from .foo import Foo
2 from .bar import Bar
3
4 __all__ = [
5 'Foo',
/home/me/circlejerking/foo.py in <module>()
----> 1 from .bar import Bar
2
3 class Foo(object):
4 my_bar = Bar()
/home/me/circlejerking/bar.py in <module>()
----> 1 from .foo import Foo
2
3 class Bar(Foo):
4 pass
ImportError: cannot import name Foo
我理解问题并且我知道,python相关的循环导入问题已被多次讨论过,但我似乎无法使其工作。 SO对此问题的两个答案是:
我相当肯定,我的设计还可以,是的,我确信这两个课程实际上并不是一件事。
在其他地方导入其他类不是一种选择,因为我需要它们在正确的位置。
有什么想法吗?
答案 0 :(得分:1)
一般情况下,您可以使用注射模式解决此问题:
这个模块原样很好:
from .foo import Foo
class Bar(Foo):
pass
然后你的其他模块变成:
class Foo(object):
bar = None
@classmethod
def set_bar(cls, bar):
cls.bar = bar
然后使用Foo来确保在使用之前适当调用set_bar。