Python和Circular再次导入

时间:2014-10-30 18:05:39

标签: python import circular-dependency

说我有一个看起来像这样的模块:

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对此问题的两个答案是:

  1. 重新设计代码,你错了或
  2. 仅在您需要的地方导入其他模块。
  3. 我相当肯定,我的设计还可以,是的,我确信这两个课程实际上并不是一件事。

    在其他地方导入其他类不是一种选择,因为我需要它们在正确的位置。

    有什么想法吗?

1 个答案:

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