交叉导入模块上的ImportError

时间:2019-05-20 10:15:03

标签: python

我对使用Python进行整个交叉导入感到非常困惑。我有一个包含主模块 main.py 和几个子模块 b.py c.py 的软件包,每个子模块都有一个类模块分别为class mainclass bclass c

__ init __。py 中:

from .main import main
from .b import b
from .c import c

main.py 中:

from .b import b 
from .c import c
class main:

b.py 中:

from .main import main 
class b:

将引发ImportError,要解决此问题,我们可以:

class b:
    def __init__(self):
        from .main import main

没关系。但是我不太明白为什么。如果我在 b.py 中有多个类或方法,该怎么办。给每种方法中的import main效率很低,甚至会影响性能吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

Python不是Java,并且既不需要也不要求使用“每个类一个模块”的方案-实际上恰恰相反,并且也不支持循环依赖关系-正如您已经发现的那样。 IOW,如果您有两个相互依赖的类(或函数或其他任何东西),则它们显然应该存在于同一模块中(无论如何,这是“低耦合,高内聚性”规则所要求的)。

导入函数或方法主体被认为是不好的做法,确实会在每次调用时增加一些开销(不是那么大的开销,但是在庞大的数据集上的紧密循环中可能会产生很大的不同),并且实际上应该只是用作不得已的临时Q&D黑客。

  

建议您减少模块的混乱程度,因为将它们放在一个模块中会导致文件很大且行太多(至少出于我的喜好)

不知道代码的实际样子就不可能回答这个问题,但是如果3个(三个!)类足以达到“太多行”的限制,那么您的类可能做得太多,并且会从中受益被重构为不同的类(可能还有简单的函数-python并不要求所有代码都生活在类中),然后其中的一些可能会提取到其他实用程序模块中。 “单一责任”原则在这里是一个很好的指导...您可能还拥有一些可以以更简洁(但仍可读)的方式重写的代码-似乎您对Python没有太多的经验,可能您没有利用完整的语言(和stdlib)功能。

现在,即使使用最好的设计和编码,有时您仍然会得到相当大的模块,因为该域本质上是复杂的,并且需要相当多的代码...这是生活中的事实,您必须学习与之相处,抱歉。

哦,是的:这一切还取决于您的资格“对于您的喜好太大”,当然-根据记录,超过1000行的模块是非常普通的。