我对使用Python进行整个交叉导入感到非常困惑。我有一个包含主模块 main.py 和几个子模块 b.py 和 c.py 的软件包,每个子模块都有一个类模块分别为class main
,class b
和class 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效率很低,甚至会影响性能吗?
非常感谢。
答案 0 :(得分:1)
Python不是Java,并且既不需要也不要求使用“每个类一个模块”的方案-实际上恰恰相反,并且也不支持循环依赖关系-正如您已经发现的那样。 IOW,如果您有两个相互依赖的类(或函数或其他任何东西),则它们显然应该存在于同一模块中(无论如何,这是“低耦合,高内聚性”规则所要求的)。
导入函数或方法主体被认为是不好的做法,确实会在每次调用时增加一些开销(不是那么大的开销,但是在庞大的数据集上的紧密循环中可能会产生很大的不同),并且实际上应该只是用作不得已的临时Q&D黑客。
建议您减少模块的混乱程度,因为将它们放在一个模块中会导致文件很大且行太多(至少出于我的喜好)
不知道代码的实际样子就不可能回答这个问题,但是如果3个(三个!)类足以达到“太多行”的限制,那么您的类可能做得太多,并且会从中受益被重构为不同的类(可能还有简单的函数-python并不要求所有代码都生活在类中),然后其中的一些可能会提取到其他实用程序模块中。 “单一责任”原则在这里是一个很好的指导...您可能还拥有一些可以以更简洁(但仍可读)的方式重写的代码-似乎您对Python没有太多的经验,可能您没有利用完整的语言(和stdlib)功能。
现在,即使使用最好的设计和编码,有时您仍然会得到相当大的模块,因为该域本质上是复杂的,并且需要相当多的代码...这是生活中的事实,您必须学习与之相处,抱歉。
哦,是的:这一切还取决于您的资格“对于您的喜好太大”,当然-根据记录,超过1000行的模块是非常普通的。