Python和循环导入

2024-09-30 06:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个这样的模块:

circlejerking/
├── bar.py
├── foo.py
└── __init__.py

你知道吗棒.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相关的循环导入问题已经讨论过多次,但是我似乎无法让它工作。 对于这个问题,有两种解决方法:

  1. 重新设计你的代码,你认为它是错误的或
  2. 只在需要的地方导入其他模块。你知道吗

我相当肯定,我的设计是好的,是的,我确信这两个类实际上不是一回事。你知道吗

将另一个类导入到其他地方不是一个选择,因为我需要它们就在原地。你知道吗

有什么想法吗?你知道吗


Tags: 模块infrompyimporthomefooinit
1条回答
网友
1楼 · 发布于 2024-09-30 06:26:24

一般来说,您可以通过注入模式来解决此问题:

这个模块很好:

from .foo import Foo
class Bar(Foo):
    pass

然后你的另一个模块变成:

class Foo(object):
    bar = None

    @classmethod
    def set_bar(cls, bar):
        cls.bar = bar

然后由使用Foo的任何人来确保在使用set\u bar之前正确地调用它。你知道吗

相关问题 更多 >

    热门问题